@@ -79,4 +79,74 @@ describe('Example - Context Menu Plugin & Hybrid Selection Mode', () => {
7979 cy . get ( '#myGrid .slick-row[data-row="6"] .slick-cell.l0.r0' ) . click ( { shiftKey : true } ) . should ( 'have.class' , 'selected' ) ;
8080 cy . get ( '#myGrid .slick-cell.selected' ) . should ( 'have.length' , 7 * 3 ) ;
8181 } ) ;
82+
83+ it ( 'should add and toggle non-contiguous cell ranges with Ctrl-click' , ( ) => {
84+ cy . visit ( `${ Cypress . config ( 'baseUrl' ) } /examples/example-plugin-hybridselectionmodel.html` ) ;
85+ cy . get ( '#myGrid .slick-row[data-row="1"] .slick-cell.l1.r1' ) . click ( ) ;
86+ cy . get ( '#myGrid .slick-row[data-row="3"] .slick-cell.l1.r1' ) . click ( { ctrlKey : true } ) ;
87+
88+ cy . get ( '#myGrid .slick-row[data-row="1"] .slick-cell.l1.r1' ) . should ( 'have.class' , 'selected' ) ;
89+ cy . get ( '#myGrid .slick-row[data-row="3"] .slick-cell.l1.r1' ) . should ( 'have.class' , 'selected' ) ;
90+ cy . get ( '#myGrid .slick-row[data-row="2"] .slick-cell.l1.r1' ) . should ( 'not.have.class' , 'selected' ) ;
91+ cy . get ( '#myGrid .slick-cell.selected' ) . should ( 'have.length' , 2 ) ;
92+
93+ cy . get ( '#myGrid .slick-row[data-row="1"] .slick-cell.l1.r1' ) . click ( { ctrlKey : true } ) ;
94+ cy . get ( '#myGrid .slick-row[data-row="1"] .slick-cell.l1.r1' ) . should ( 'not.have.class' , 'selected' ) ;
95+ cy . get ( '#myGrid .slick-row[data-row="3"] .slick-cell.l1.r1' ) . should ( 'have.class' , 'selected' ) ;
96+ cy . get ( '#myGrid .slick-cell.selected' ) . should ( 'have.length' , 1 ) ;
97+ } ) ;
98+
99+ it ( 'should split a rectangular cell range when Ctrl-clicking an interior cell' , ( ) => {
100+ cy . visit ( `${ Cypress . config ( 'baseUrl' ) } /examples/example-plugin-hybridselectionmodel.html` ) ;
101+ cy . get ( '#myGrid .slick-row[data-row="1"] .slick-cell.l1.r1' ) . click ( ) ;
102+ cy . get ( '#myGrid .slick-row[data-row="1"] .slick-cell.l1.r1' )
103+ . find ( '.slick-drag-replace-handle' )
104+ . trigger ( 'mousedown' , { which : 1 , force : true } ) ;
105+ cy . get ( '#myGrid .slick-row[data-row="3"] .slick-cell.l3.r3' )
106+ . trigger ( 'mousemove' , 'bottomRight' )
107+ . trigger ( 'mouseup' , 'bottomRight' , { which : 1 , force : true } ) ;
108+ cy . get ( '#myGrid .slick-cell.selected' ) . should ( 'have.length' , 9 ) ;
109+
110+ cy . get ( '#myGrid .slick-row[data-row="2"] .slick-cell.l2.r2' ) . click ( { ctrlKey : true } ) ;
111+ cy . get ( '#myGrid .slick-row[data-row="2"] .slick-cell.l2.r2' ) . should ( 'not.have.class' , 'selected' ) ;
112+ cy . get ( '#myGrid .slick-cell.selected' ) . should ( 'have.length' , 8 ) ;
113+ cy . window ( ) . then ( ( win : any ) => {
114+ expect ( win . grid . getSelectionModel ( ) . getSelectedRanges ( ) ) . to . have . length ( 4 ) ;
115+ } ) ;
116+ } ) ;
117+
118+ it ( 'should add a row range with Ctrl-drag without accumulating live preview ranges' , ( ) => {
119+ cy . visit ( `${ Cypress . config ( 'baseUrl' ) } /examples/example-plugin-hybridselectionmodel.html` ) ;
120+ cy . get ( '#myGrid .slick-row[data-row="1"] .slick-cell.l0.r0' ) . click ( ) ;
121+ cy . get ( '#myGrid .slick-row[data-row="3"] .slick-cell.l0.r0' ) . as ( 'secondRowCell' ) ;
122+ cy . get ( '@secondRowCell' ) . trigger ( 'mousedown' , { which : 1 , ctrlKey : true , force : true } ) ;
123+ cy . get ( '@secondRowCell' ) . trigger ( 'mousemove' , 30 , 10 , { ctrlKey : true , force : true } ) ;
124+ cy . get ( '@secondRowCell' ) . trigger ( 'mousemove' , 30 , 52 , { ctrlKey : true , force : true } ) ;
125+
126+ cy . window ( ) . then ( ( win : any ) => {
127+ const ranges = win . grid . getSelectionModel ( ) . getSelectedRanges ( ) ;
128+ expect ( ranges ) . to . have . length ( 2 ) ;
129+ expect ( ranges [ 0 ] ) . to . include ( { fromRow : 1 , toRow : 1 } ) ;
130+ expect ( ranges [ 1 ] ) . to . include ( { fromRow : 3 , toRow : 4 } ) ;
131+ } ) ;
132+
133+ cy . dragEnd ( '#myGrid' ) ;
134+
135+ cy . get ( '#myGrid .slick-row[data-row="1"] .slick-cell.selected' ) . should ( 'have.length' , 7 ) ;
136+ cy . get ( '#myGrid .slick-row[data-row="2"] .slick-cell.selected' ) . should ( 'have.length' , 0 ) ;
137+ cy . get ( '#myGrid .slick-row[data-row="3"] .slick-cell.selected' ) . should ( 'have.length' , 7 ) ;
138+ cy . get ( '#myGrid .slick-row[data-row="4"] .slick-cell.selected' ) . should ( 'have.length' , 7 ) ;
139+ cy . get ( '#myGrid .slick-cell.selected' ) . should ( 'have.length' , 7 * 3 ) ;
140+ } ) ;
141+
142+ it ( 'should synchronize the selected cell when selectActiveRow is disabled in cell mode' , ( ) => {
143+ cy . visit ( `${ Cypress . config ( 'baseUrl' ) } /examples/example-plugin-hybridselectionmodel.html` ) ;
144+ cy . window ( ) . then ( ( win : any ) => {
145+ const selectionModel = win . grid . getSelectionModel ( ) ;
146+ selectionModel . setOptions ( { selectionType : 'cell' , selectActiveRow : false , selectActiveCell : true } ) ;
147+ win . grid . setActiveCell ( 5 , 1 , false , false ) ;
148+ expect ( selectionModel . getSelectedRanges ( ) ) . to . have . length ( 1 ) ;
149+ expect ( selectionModel . getSelectedRanges ( ) [ 0 ] ) . to . include ( { fromRow : 5 , fromCell : 1 , toRow : 5 , toCell : 1 } ) ;
150+ } ) ;
151+ } ) ;
82152} ) ;
0 commit comments