]> git.proxmox.com Git - extjs.git/blame - extjs/classic/classic/test/specs/selection/CheckboxModel.js
add extjs 6.0.1 sources
[extjs.git] / extjs / classic / classic / test / specs / selection / CheckboxModel.js
CommitLineData
6527f429
DM
1describe('Ext.selection.CheckboxModel', function() {\r
2 var grid, view, store, checkboxModel, data,\r
3 donRec, evanRec, nigeRec,\r
4 synchronousLoad = true,\r
5 proxyStoreLoad = Ext.data.ProxyStore.prototype.load,\r
6 loadStore;\r
7\r
8 function makeGrid(selectionCfg, cfg) {\r
9 checkboxModel = new Ext.selection.CheckboxModel(selectionCfg);\r
10 checkboxModel.getHeaderCheckbox = function() {\r
11 return this.views[0].headerCt.child('gridcolumn[isCheckerHd]');\r
12 };\r
13\r
14 grid = new Ext.grid.Panel(Ext.apply({\r
15 store: store,\r
16 columns: [\r
17 {text: "name", flex: 1, sortable: true, dataIndex: 'name'}\r
18 ],\r
19 columnLines: true,\r
20 selModel: checkboxModel,\r
21 width: 300,\r
22 height: 300,\r
23 renderTo: Ext.getBody()\r
24 }, cfg));\r
25 view = grid.view;\r
26 }\r
27\r
28 beforeEach(function() {\r
29 // Override so that we can control asynchronous loading\r
30 loadStore = Ext.data.ProxyStore.prototype.load = function() {\r
31 proxyStoreLoad.apply(this, arguments);\r
32 if (synchronousLoad) {\r
33 this.flushLoad.apply(this, arguments);\r
34 }\r
35 return this;\r
36 };\r
37\r
38 Ext.define('spec.CheckboxModel', {\r
39 extend: 'Ext.data.Model',\r
40 fields: [{\r
41 name: 'name'\r
42 }]\r
43 });\r
44\r
45 store = Ext.create('Ext.data.Store', {\r
46 model: 'spec.CheckboxModel',\r
47 proxy: 'memory',\r
48 data: data || [{\r
49 id: 1,\r
50 name: 'Don'\r
51 }, {\r
52 id: 2,\r
53 name: 'Evan'\r
54 }, {\r
55 id: 3,\r
56 name: 'Nige'\r
57 }]\r
58 });\r
59\r
60 donRec = store.getById(1);\r
61 evanRec = store.getById(2);\r
62 nigeRec = store.getById(3);\r
63 });\r
64\r
65 afterEach(function() {\r
66 // Undo the overrides.\r
67 Ext.data.ProxyStore.prototype.load = proxyStoreLoad;\r
68\r
69 donRec = evanRec = nigeRec = data = null;\r
70 grid.destroy();\r
71 checkboxModel.destroy();\r
72 store.destroy();\r
73 Ext.undefine('spec.CheckboxModel');\r
74 Ext.data.Model.schema.clear();\r
75 });\r
76\r
77 function expectHeaderChecked(checkboxModel, checked) {\r
78 var headerCheckbox = checkboxModel.getHeaderCheckbox();\r
79 expect(headerCheckbox.hasCls(checkboxModel.checkerOnCls)).toBe(checked);\r
80 }\r
81\r
82 function clickOnHeaderCheckbox() {\r
83 jasmine.fireMouseEvent(checkboxModel.getHeaderCheckbox().el.dom, 'click', 10, 10);\r
84 }\r
85\r
86 function clickCheckbox(rowIdx) {\r
87 var cell = view.getCellByPosition({\r
88 row: rowIdx,\r
89 column: 0\r
90 });\r
91 view.focus();\r
92 jasmine.fireMouseEvent(cell.down(checkboxModel.checkSelector), 'click');\r
93 }\r
94\r
95 function clickCell(rowIdx, colIdx) {\r
96 var cell = view.getCellByPosition({\r
97 row: rowIdx,\r
98 column: colIdx\r
99 });\r
100 view.focus();\r
101 jasmine.fireMouseEvent(cell, 'click');\r
102 }\r
103\r
104 function keyCheckbox(rowIdx, keyCode, shiftKey, ctrlKey, altKey) {\r
105 var cell = grid.getView().getCellByPosition({\r
106 row: rowIdx,\r
107 column: 0\r
108 });\r
109 jasmine.fireKeyEvent(cell.down(checkboxModel.checkSelector), 'keydown', keyCode, shiftKey, ctrlKey, altKey);\r
110 }\r
111\r
112 describe("column insertion", function() {\r
113 var cols;\r
114\r
115 afterEach(function() {\r
116 cols = null;\r
117 });\r
118\r
119 it("should ignore any xtype defaults and insert a gridcolumn", function() {\r
120 makeGrid(null, {\r
121 columns: {\r
122 defaults: {\r
123 xtype: 'widgetcolumn',\r
124 widget: {\r
125 xtype: 'button'\r
126 }\r
127 },\r
128 items: [{\r
129 dataIndex: 'name'\r
130 }]\r
131 }\r
132 });\r
133 var allCols = grid.getColumnManager().getColumns();\r
134 expect(allCols[0].$className).toBe('Ext.grid.column.Column');\r
135 expect(allCols[0].isCheckerHd).toBe(true);\r
136 });\r
137\r
138 describe("without locking", function() {\r
139 beforeEach(function() {\r
140 cols = [{\r
141 dataIndex: 'name'\r
142 }, {\r
143 dataIndex: 'name'\r
144 }, {\r
145 dataIndex: 'name'\r
146 }]\r
147 });\r
148\r
149 it("should insert the column at the start by default", function() {\r
150 makeGrid(null, {\r
151 columns: cols\r
152 });\r
153\r
154 var allCols = grid.getColumnManager().getColumns(),\r
155 col = allCols[0];\r
156\r
157 expect(col.isCheckerHd).toBe(true);\r
158 expect(grid.query('[isCheckerHd]').length).toBe(1);\r
159 expect(allCols.length).toBe(4);\r
160 });\r
161\r
162 it("should insert the column at the start with injectCheckbox: 'first'", function() {\r
163 makeGrid({\r
164 injectCheckbox: 'first'\r
165 }, {\r
166 columns: cols\r
167 });\r
168\r
169 var allCols = grid.getColumnManager().getColumns(),\r
170 col = allCols[0];\r
171\r
172 expect(col.isCheckerHd).toBe(true);\r
173 expect(grid.query('[isCheckerHd]').length).toBe(1);\r
174 expect(allCols.length).toBe(4);\r
175 });\r
176\r
177 it("should insert the column at the end with injectCheckbox: 'last'", function() {\r
178 makeGrid({\r
179 injectCheckbox: 'last'\r
180 }, {\r
181 columns: cols\r
182 });\r
183\r
184 var allCols = grid.getColumnManager().getColumns(),\r
185 col = allCols[3];\r
186\r
187 expect(col.isCheckerHd).toBe(true);\r
188 expect(grid.query('[isCheckerHd]').length).toBe(1);\r
189 expect(allCols.length).toBe(4);\r
190 });\r
191\r
192 it("should insert the column at the specified index", function() {\r
193 makeGrid({\r
194 injectCheckbox: 1\r
195 }, {\r
196 columns: cols\r
197 });\r
198\r
199 var allCols = grid.getColumnManager().getColumns(),\r
200 col = allCols[1];\r
201\r
202 expect(col.isCheckerHd).toBe(true);\r
203 expect(grid.query('[isCheckerHd]').length).toBe(1);\r
204 expect(allCols.length).toBe(4);\r
205 });\r
206 });\r
207\r
208 describe("with locking", function() {\r
209 beforeEach(function() {\r
210 cols = [{\r
211 dataIndex: 'name',\r
212 locked: true\r
213 }, {\r
214 dataIndex: 'name',\r
215 locked: true\r
216 }, {\r
217 dataIndex: 'name',\r
218 locked: true\r
219 }, {\r
220 dataIndex: 'name'\r
221 }, {\r
222 dataIndex: 'name'\r
223 }, {\r
224 dataIndex: 'name'\r
225 }];\r
226 });\r
227\r
228 it("should insert the column at the start by default", function() {\r
229 makeGrid(null, {\r
230 columns: cols\r
231 });\r
232\r
233 var allCols = grid.getColumnManager().getColumns(),\r
234 col = allCols[0];\r
235\r
236 expect(col.isCheckerHd).toBe(true);\r
237 expect(grid.query('[isCheckerHd]').length).toBe(1);\r
238 expect(grid.normalGrid.query('[isCheckerHd]').length).toBe(0);\r
239 expect(allCols.length).toBe(7);\r
240 });\r
241\r
242 it("should insert the column at the start with injectCheckbox: 'first'", function() {\r
243 makeGrid({\r
244 injectCheckbox: 'first'\r
245 }, {\r
246 columns: cols\r
247 });\r
248 \r
249 var allCols = grid.getColumnManager().getColumns(),\r
250 col = allCols[0];\r
251\r
252 expect(col.isCheckerHd).toBe(true);\r
253 expect(grid.query('[isCheckerHd]').length).toBe(1);\r
254 expect(grid.normalGrid.query('[isCheckerHd]').length).toBe(0);\r
255 expect(allCols.length).toBe(7);\r
256 });\r
257\r
258 it("should insert the column at the end with injectCheckbox: 'last'", function() {\r
259 makeGrid({\r
260 injectCheckbox: 'last'\r
261 }, {\r
262 columns: cols\r
263 });\r
264\r
265 var allCols = grid.getColumnManager().getColumns(),\r
266 col = allCols[3];\r
267\r
268 expect(col.isCheckerHd).toBe(true);\r
269 expect(grid.query('[isCheckerHd]').length).toBe(1);\r
270 expect(grid.normalGrid.query('[isCheckerHd]').length).toBe(0);\r
271 expect(allCols.length).toBe(7);\r
272 });\r
273\r
274 it("should insert the column at the specified index", function() {\r
275 makeGrid({\r
276 injectCheckbox: 1\r
277 }, {\r
278 columns: cols\r
279 });\r
280\r
281 var allCols = grid.getColumnManager().getColumns(),\r
282 col = allCols[1];\r
283\r
284 expect(col.isCheckerHd).toBe(true);\r
285 expect(grid.query('[isCheckerHd]').length).toBe(1);\r
286 expect(grid.normalGrid.query('[isCheckerHd]').length).toBe(0);\r
287 expect(allCols.length).toBe(7);\r
288 });\r
289 });\r
290 });\r
291\r
292 describe("multiple selection", function() {\r
293 beforeEach(function() {\r
294 makeGrid();\r
295 });\r
296 describe('by clicking', function() {\r
297 // for some reason this spec fails in IE10+, although the functionality works\r
298 // when tested manually\r
299 (Ext.isIE ? xit : it)('should select unselected records on click, and deselect selected records on click', function() {\r
300 grid.focus();\r
301\r
302 // Wait for the asynchronous focus processing to occur for IE\r
303 waitsFor(function() {\r
304 return view.cellFocused;\r
305 });\r
306 \r
307 runs(function() {\r
308 clickCheckbox(0);\r
309 clickCheckbox(1);\r
310 clickCheckbox(2);\r
311 });\r
312 waitsFor(function() {\r
313 return checkboxModel.getSelection().length === 3;\r
314 }, 'all three records to be selected');\r
315 runs(function() {\r
316 clickCheckbox(1);\r
317 });\r
318 waitsFor(function() {\r
319 return checkboxModel.getSelection().length === 2;\r
320 }, 'the first record to be deselected');\r
321 });\r
322 });\r
323 describe('by key navigation', function() {\r
324 it('should select unselected records on ctrl+SPACE, and deselect selected records on ctrl+SPACE', function() {\r
325 grid.view.getNavigationModel().setPosition(0);\r
326 expect(checkboxModel.getSelection().length).toBe(0);\r
327 keyCheckbox(0, Ext.event.Event.SPACE);\r
328 expect(checkboxModel.getSelection().length).toBe(1);\r
329 keyCheckbox(0, Ext.event.Event.DOWN, false, true);\r
330 expect(checkboxModel.getSelection().length).toBe(1);\r
331 keyCheckbox(1, Ext.event.Event.DOWN, false, true);\r
332 keyCheckbox(2, Ext.event.Event.SPACE);\r
333 expect(checkboxModel.getSelection().length).toBe(2);\r
334 keyCheckbox(2, Ext.event.Event.UP, false, true);\r
335 keyCheckbox(1, Ext.event.Event.UP, false, true);\r
336 keyCheckbox(0, Ext.event.Event.SPACE);\r
337 expect(checkboxModel.getSelection().length).toBe(1);\r
338 });\r
339 });\r
340 });\r
341\r
342 describe("header state", function() {\r
343 beforeEach(function() {\r
344 makeGrid();\r
345 });\r
346\r
347 it("should be initially unchecked", function() {\r
348 expectHeaderChecked(checkboxModel, false);\r
349 });\r
350 \r
351 it("should be unchecked if there are no records", function(){\r
352 store.removeAll();\r
353 expectHeaderChecked(checkboxModel, false);\r
354 });\r
355\r
356 it("should check header when all rows are selected", function() {\r
357 expectHeaderChecked(checkboxModel, false);\r
358\r
359 checkboxModel.select(donRec, true);\r
360 expectHeaderChecked(checkboxModel, false);\r
361\r
362 checkboxModel.select(evanRec, true);\r
363 expectHeaderChecked(checkboxModel, false);\r
364\r
365 checkboxModel.select(nigeRec, true);\r
366 expectHeaderChecked(checkboxModel, true);\r
367 });\r
368\r
369 it("should uncheck header when any row is deselected", function() {\r
370 checkboxModel.selectAll();\r
371 expectHeaderChecked(checkboxModel, true);\r
372\r
373 checkboxModel.selectAll();\r
374 checkboxModel.deselect(donRec);\r
375 expectHeaderChecked(checkboxModel, false);\r
376\r
377 checkboxModel.selectAll();\r
378 checkboxModel.deselect(evanRec);\r
379 expectHeaderChecked(checkboxModel, false);\r
380\r
381 checkboxModel.selectAll();\r
382 checkboxModel.deselect(nigeRec);\r
383 expectHeaderChecked(checkboxModel, false);\r
384 });\r
385\r
386 describe("loading", function() {\r
387 it("should keep the header checked when reloaded and all items were checked", function() {\r
388 checkboxModel.selectAll();\r
389 expectHeaderChecked(checkboxModel, true);\r
390 store.load();\r
391 expectHeaderChecked(checkboxModel, true);\r
392 });\r
393 \r
394 it("should keep the header checked when reloaded and loading a subset of items", function() {\r
395 checkboxModel.selectAll();\r
396 expectHeaderChecked(checkboxModel, true);\r
397\r
398 store.getProxy().setData([{\r
399 id: 1,\r
400 name: 'Don'\r
401 }]);\r
402 store.load();\r
403 expectHeaderChecked(checkboxModel, true);\r
404 });\r
405 \r
406 it("should be unchecked when the loaded items do not match", function() {\r
407 checkboxModel.selectAll();\r
408 expectHeaderChecked(checkboxModel, true);\r
409\r
410 store.getProxy().setData([{\r
411 id: 4,\r
412 name: 'Foo'\r
413 }]);\r
414 store.load();\r
415 expectHeaderChecked(checkboxModel, false);\r
416 }); \r
417 });\r
418\r
419 it("should uncheck header when an unchecked record is added", function() {\r
420 checkboxModel.selectAll();\r
421 expectHeaderChecked(checkboxModel, true);\r
422\r
423 store.add({name: 'Marcelo'});\r
424 expectHeaderChecked(checkboxModel, false);\r
425 });\r
426\r
427 it("should check header when last unchecked record is removed before rows are rendered", function() {\r
428 checkboxModel.select(donRec, true);\r
429 checkboxModel.select(evanRec, true);\r
430 expectHeaderChecked(checkboxModel, false);\r
431\r
432 store.removeAt(store.find('name', 'Nige'));\r
433\r
434 waitsFor(function() {\r
435 return grid.view.viewReady;\r
436 });\r
437 runs(function() {\r
438 expectHeaderChecked(checkboxModel, true);\r
439 });\r
440 });\r
441\r
442 it("should check header when last unchecked record is removed after rows are rendered", function() {\r
443 checkboxModel.select(donRec, true);\r
444 checkboxModel.select(evanRec, true);\r
445 expectHeaderChecked(checkboxModel, false);\r
446\r
447 waitsFor(function() {\r
448 return grid.view.viewReady;\r
449 });\r
450\r
451 runs(function() {\r
452 store.remove(nigeRec);\r
453 expectHeaderChecked(checkboxModel, true);\r
454 });\r
455 });\r
456\r
457 });\r
458\r
459 describe("check all", function() {\r
460 describe('mode="SINGLE"', function () {\r
461 it('should not render the header checkbox by default', function () {\r
462 makeGrid({\r
463 mode: 'SINGLE'\r
464 });\r
465\r
466 expect(checkboxModel.getHeaderCheckbox()).toBe(null);\r
467 });\r
468\r
469 it('should not render the header checkbox by config', function () {\r
470 expect(function () {\r
471 makeGrid({\r
472 mode: 'SINGLE',\r
473 showHeaderCheckbox: true\r
474 });\r
475 }).toThrow('The header checkbox is not supported for SINGLE mode selection models.')\r
476 });\r
477 });\r
478\r
479 describe('mode="MULTI"', function () {\r
480 beforeEach(function() {\r
481 makeGrid();\r
482 });\r
483\r
484 it("should check all when no record is checked", function() {\r
485 expectHeaderChecked(checkboxModel, false);\r
486\r
487 clickOnHeaderCheckbox();\r
488 expectHeaderChecked(checkboxModel, true);\r
489\r
490 expect(checkboxModel.isSelected(donRec)).toBe(true);\r
491 expect(checkboxModel.isSelected(evanRec)).toBe(true);\r
492 expect(checkboxModel.isSelected(nigeRec)).toBe(true);\r
493 });\r
494\r
495 it("should check all when some records are checked", function() {\r
496 expectHeaderChecked(checkboxModel, false);\r
497\r
498 checkboxModel.select(donRec, true);\r
499 checkboxModel.select(nigeRec, true);\r
500\r
501 clickOnHeaderCheckbox();\r
502 expectHeaderChecked(checkboxModel, true);\r
503\r
504 expect(checkboxModel.isSelected(donRec)).toBe(true);\r
505 expect(checkboxModel.isSelected(evanRec)).toBe(true);\r
506 expect(checkboxModel.isSelected(nigeRec)).toBe(true);\r
507 });\r
508 });\r
509 });\r
510\r
511 describe("uncheck all", function() {\r
512 beforeEach(function() {\r
513 makeGrid();\r
514 });\r
515\r
516 it("should uncheck all when all records are checked", function() {\r
517 checkboxModel.select(donRec, true);\r
518 checkboxModel.select(evanRec, true);\r
519 checkboxModel.select(nigeRec, true);\r
520 expectHeaderChecked(checkboxModel, true);\r
521\r
522 clickOnHeaderCheckbox();\r
523 expectHeaderChecked(checkboxModel, false);\r
524 expect(checkboxModel.isSelected(donRec)).toBe(false);\r
525 expect(checkboxModel.isSelected(evanRec)).toBe(false);\r
526 expect(checkboxModel.isSelected(nigeRec)).toBe(false);\r
527 });\r
528\r
529 });\r
530\r
531 describe("checkOnly", function() {\r
532 function byPos(row, col) {\r
533 return grid.getView().getCellByPosition({\r
534 row: row,\r
535 column: col\r
536 });\r
537 }\r
538\r
539 function makeCheckGrid(checkOnly, mode) {\r
540 makeGrid({\r
541 checkOnly: checkOnly,\r
542 mode: mode\r
543 });\r
544 }\r
545\r
546 describe("mode: multi", function() {\r
547 describe("with checkOnly: true", function() {\r
548 beforeEach(function() {\r
549 makeCheckGrid(true, 'MULTI');\r
550 });\r
551\r
552 it("should not select when clicking on the row", function() {\r
553 jasmine.fireMouseEvent(byPos(0, 1), 'click');\r
554 expect(checkboxModel.isSelected(donRec)).toBe(false);\r
555 });\r
556\r
557 it("should not select when calling selectByPosition on a cell other than the checkbox cell", function() {\r
558 checkboxModel.selectByPosition({\r
559 row: 0,\r
560 column: 1\r
561 });\r
562 expect(checkboxModel.isSelected(donRec)).toBe(false);\r
563 });\r
564\r
565 it("should not select when navigating with keys", function() {\r
566 jasmine.fireMouseEvent(byPos(0, 1), 'click');\r
567 jasmine.fireKeyEvent(byPos(0, 1), 'keydown', Ext.event.Event.LEFT);\r
568 expect(checkboxModel.isSelected(donRec)).toBe(false);\r
569 jasmine.fireKeyEvent(byPos(0, 0), 'keydown', Ext.event.Event.RIGHT);\r
570 expect(checkboxModel.isSelected(donRec)).toBe(false);\r
571 });\r
572\r
573 it("should select when clicking on the checkbox", function() {\r
574 var checker = byPos(0, 0).down(checkboxModel.checkSelector);\r
575 jasmine.fireMouseEvent(checker, 'click');\r
576 expect(checkboxModel.isSelected(donRec)).toBe(true);\r
577 });\r
578\r
579 it("should select when pressing space with the checker focused", function() {\r
580 jasmine.fireMouseEvent(byPos(0, 1), 'click');\r
581 jasmine.fireKeyEvent(byPos(0, 1), 'keydown', Ext.event.Event.LEFT);\r
582 expect(checkboxModel.isSelected(donRec)).toBe(false);\r
583 jasmine.fireKeyEvent(byPos(0, 0), 'keydown', Ext.event.Event.SPACE);\r
584 expect(checkboxModel.isSelected(donRec)).toBe(true);\r
585 });\r
586 });\r
587\r
588 describe("with checkOnly: false", function() {\r
589 beforeEach(function() {\r
590 makeCheckGrid(false, 'MULTI');\r
591 });\r
592\r
593 it("should select when clicking on the row", function() {\r
594 jasmine.fireMouseEvent(byPos(0, 1), 'click');\r
595 expect(checkboxModel.isSelected(donRec)).toBe(true);\r
596 });\r
597\r
598 it("should select when calling selectByPosition on a cell other than the checkbox cell", function() {\r
599 checkboxModel.selectByPosition({\r
600 row: 0,\r
601 column: 1\r
602 });\r
603 expect(checkboxModel.isSelected(donRec)).toBe(true);\r
604 });\r
605\r
606 it("should select when navigating with keys", function() {\r
607 jasmine.fireMouseEvent(byPos(0, 1), 'click');\r
608 jasmine.fireKeyEvent(byPos(0, 1), 'keydown', Ext.event.Event.DOWN);\r
609 expect(checkboxModel.isSelected(evanRec)).toBe(true);\r
610 });\r
611\r
612 it("should select when clicking on the checkbox", function() {\r
613 var checker = byPos(0, 0).down(checkboxModel.checkSelector);\r
614 jasmine.fireMouseEvent(checker, 'click');\r
615 expect(checkboxModel.isSelected(donRec)).toBe(true);\r
616 });\r
617 });\r
618 });\r
619\r
620 describe("mode: single", function() {\r
621 describe("with checkOnly: true", function() {\r
622 beforeEach(function() {\r
623 makeCheckGrid(true, 'SINGLE');\r
624 });\r
625\r
626 it("should not select when clicking on the row", function() {\r
627 jasmine.fireMouseEvent(byPos(0, 1), 'click');\r
628 expect(checkboxModel.isSelected(donRec)).toBe(false);\r
629 });\r
630\r
631 it("should not select when navigating with keys", function() {\r
632 jasmine.fireMouseEvent(byPos(0, 1), 'click');\r
633 jasmine.fireKeyEvent(byPos(0, 1), 'keydown', Ext.event.Event.LEFT);\r
634 expect(checkboxModel.isSelected(donRec)).toBe(false);\r
635 jasmine.fireKeyEvent(byPos(0, 0), 'keydown', Ext.event.Event.RIGHT);\r
636 expect(checkboxModel.isSelected(donRec)).toBe(false);\r
637 });\r
638\r
639 it("should select when clicking on the checkbox", function() {\r
640 var checker = byPos(0, 0).down(checkboxModel.checkSelector);\r
641 jasmine.fireMouseEvent(checker, 'click');\r
642 expect(checkboxModel.isSelected(donRec)).toBe(true);\r
643 });\r
644\r
645 it("should select when pressing space with the checker focused", function() {\r
646 jasmine.fireMouseEvent(byPos(0, 1), 'click');\r
647 jasmine.fireKeyEvent(byPos(0, 1), 'keydown', Ext.event.Event.LEFT);\r
648 expect(checkboxModel.isSelected(donRec)).toBe(false);\r
649 jasmine.fireKeyEvent(byPos(0, 0), 'keydown', Ext.event.Event.SPACE);\r
650 expect(checkboxModel.isSelected(donRec)).toBe(true);\r
651 });\r
652 });\r
653\r
654 describe("with checkOnly: false", function() {\r
655 beforeEach(function() {\r
656 makeCheckGrid(false, 'SINGLE');\r
657 });\r
658\r
659 it("should select when clicking on the row", function() {\r
660 jasmine.fireMouseEvent(byPos(0, 1), 'click');\r
661 expect(checkboxModel.isSelected(donRec)).toBe(true);\r
662 });\r
663\r
664 it("should select when navigating with keys", function() {\r
665 jasmine.fireMouseEvent(byPos(0, 1), 'click');\r
666 jasmine.fireKeyEvent(byPos(0, 1), 'keydown', Ext.event.Event.DOWN);\r
667 expect(checkboxModel.isSelected(evanRec)).toBe(true);\r
668 });\r
669\r
670 it("should select when clicking on the checkbox", function() {\r
671 var checker = byPos(0, 0).down(checkboxModel.checkSelector);\r
672 jasmine.fireMouseEvent(checker, 'click');\r
673 expect(checkboxModel.isSelected(donRec)).toBe(true);\r
674 });\r
675 });\r
676 });\r
677 });\r
678\r
679 describe("event selection", function() {\r
680 var changeSpy, selectSpy, deselectSpy;\r
681\r
682 function makeSpies() {\r
683 changeSpy = jasmine.createSpy();\r
684 selectSpy = jasmine.createSpy();\r
685 deselectSpy = jasmine.createSpy();\r
686\r
687 checkboxModel.on('selectionchange', changeSpy);\r
688 checkboxModel.on('select', selectSpy);\r
689 checkboxModel.on('deselect', deselectSpy);\r
690 }\r
691\r
692 function expectChangeSpy(records) {\r
693 var args = changeSpy.mostRecentCall.args;\r
694 expect(changeSpy.callCount).toBe(1);\r
695 expect(args[0]).toBe(checkboxModel);\r
696 expect(args[1]).toEqual(records);\r
697 }\r
698\r
699 function expectSelectSpy(record) {\r
700 var args = selectSpy.mostRecentCall.args;\r
701 expect(selectSpy.callCount).toBe(1);\r
702 expect(args[0]).toBe(checkboxModel);\r
703 expect(args[1]).toBe(record);\r
704 }\r
705\r
706 function expectDeselectSpy(record) {\r
707 var args = deselectSpy.mostRecentCall.args;\r
708 expect(deselectSpy.callCount).toBe(1);\r
709 expect(args[0]).toBe(checkboxModel);\r
710 expect(args[1]).toBe(record);\r
711 }\r
712\r
713 afterEach(function() {\r
714 changeSpy = selectSpy = deselectSpy = null;\r
715 });\r
716\r
717 describe("multi", function() {\r
718 beforeEach(function() {\r
719 makeGrid({\r
720 mode: 'MULTI'\r
721 });\r
722 });\r
723\r
724 describe("selection when clicking on the checkbox", function() {\r
725 describe("on a selected record", function() {\r
726 it("should deselect when there are no other selections", function() {\r
727 checkboxModel.select(donRec);\r
728 makeSpies();\r
729 clickCheckbox(0);\r
730 expect(checkboxModel.isSelected(donRec)).toBe(false);\r
731 expectChangeSpy([]);\r
732 expectDeselectSpy(donRec);\r
733 expect(selectSpy).not.toHaveBeenCalled();\r
734 });\r
735\r
736 it("should deselect and keep existing selections", function() {\r
737 checkboxModel.selectAll();\r
738 makeSpies();\r
739 clickCheckbox(0);\r
740 expect(checkboxModel.isSelected(donRec)).toBe(false);\r
741 expectChangeSpy([evanRec, nigeRec]);\r
742 expectDeselectSpy(donRec);\r
743 expect(selectSpy).not.toHaveBeenCalled();\r
744 });\r
745 });\r
746\r
747 describe("on an unselected record", function() {\r
748 it("should select the record when there are no other selections", function() {\r
749 makeSpies();\r
750 clickCheckbox(0);\r
751 expect(checkboxModel.isSelected(donRec)).toBe(true);\r
752 expectChangeSpy([donRec]);\r
753 expectSelectSpy(donRec);\r
754 expect(deselectSpy).not.toHaveBeenCalled();\r
755 });\r
756\r
757 it("should select and keep existing selections", function() {\r
758 checkboxModel.select([evanRec, nigeRec]);\r
759 makeSpies();\r
760 clickCheckbox(0);\r
761 expect(checkboxModel.isSelected(donRec)).toBe(true);\r
762 expectChangeSpy([evanRec, nigeRec, donRec]);\r
763 expectSelectSpy(donRec);\r
764 expect(deselectSpy).not.toHaveBeenCalled();\r
765 });\r
766 });\r
767 });\r
768\r
769 describe("with shiftKey", function() {\r
770 var philRec;\r
771\r
772 beforeEach(function() {\r
773 philRec = store.add({\r
774 id: 4,\r
775 name: 'Phil'\r
776 })[0];\r
777 });\r
778\r
779 it("should deselect everything past & including the clicked item", function() {\r
780 checkboxModel.selectAll();\r
781 var view = grid.getView(),\r
782 cell;\r
783\r
784 clickCell(0, 1);\r
785 spyOn(view, 'processUIEvent').andCallFake(function(e) {\r
786 if (e.type === 'click') {\r
787 e.shiftKey = true;\r
788 }\r
789 Ext.grid.View.prototype.processUIEvent.apply(view, arguments);\r
790 });\r
791\r
792 clickCell(2, 1);\r
793 clickCell(1, 1);\r
794 expect(checkboxModel.isSelected(donRec)).toBe(true);\r
795 expect(checkboxModel.isSelected(evanRec)).toBe(true);\r
796 expect(checkboxModel.isSelected(nigeRec)).toBe(false);\r
797 expect(checkboxModel.isSelected(philRec)).toBe(false);\r
798 });\r
799 });\r
800 });\r
801\r
802 describe("single", function() {\r
803 beforeEach(function() {\r
804 makeGrid({\r
805 mode: 'SINGLE'\r
806 });\r
807 });\r
808\r
809 describe("on the checkbox", function() {\r
810 it("should select the record on click", function() {\r
811 clickCheckbox(0);\r
812 expect(checkboxModel.isSelected(donRec)).toBe(true);\r
813 });\r
814\r
815 it("should deselect any selected records", function() {\r
816 clickCheckbox(0);\r
817 clickCheckbox(1);\r
818 expect(checkboxModel.isSelected(donRec)).toBe(false);\r
819 expect(checkboxModel.isSelected(evanRec)).toBe(true);\r
820 });\r
821 });\r
822\r
823 describe("on the row", function() {\r
824 it("should select the record on click", function() {\r
825 clickCheckbox(0);\r
826 expect(checkboxModel.isSelected(donRec)).toBe(true);\r
827 });\r
828\r
829 it("should deselect any selected records", function() {\r
830 clickCheckbox(0);\r
831 clickCheckbox(1);\r
832 expect(checkboxModel.isSelected(donRec)).toBe(false);\r
833 expect(checkboxModel.isSelected(evanRec)).toBe(true);\r
834 });\r
835 });\r
836 });\r
837 });\r
838\r
839});\r