diff --git a/projects/igniteui-angular/src/lib/grids/grid/grid-row-selection.spec.ts b/projects/igniteui-angular/src/lib/grids/grid/grid-row-selection.spec.ts index ad3b8c18631..a9711744fc5 100644 --- a/projects/igniteui-angular/src/lib/grids/grid/grid-row-selection.spec.ts +++ b/projects/igniteui-angular/src/lib/grids/grid/grid-row-selection.spec.ts @@ -543,6 +543,53 @@ describe('IgxGrid - Row Selection #grid', () => { } }); + it('Should select the correct rows with Shift + Click when grouping is activated', () => { + expect(grid.selectRowOnClick).toBe(true); + spyOn(grid.rowSelectionChanging, 'emit').and.callThrough(); + + grid.groupBy({ + fieldName: 'ProductName', dir: SortingDirection.Desc, ignoreCase: false + }); + + fix.detectChanges(); + + const firstGroupRow = grid.gridAPI.get_row_by_index(1); + const lastGroupRow = grid.gridAPI.get_row_by_index(4); + + // Clicking on the first row within a group + UIInteractions.simulateClickEvent(firstGroupRow.nativeElement); + fix.detectChanges(); + + GridSelectionFunctions.verifyRowSelected(firstGroupRow); + + // Simulate Shift+Click on a row within another group + const mockEvent = new MouseEvent('click', { shiftKey: true }); + lastGroupRow.nativeElement.dispatchEvent(mockEvent); + fix.detectChanges(); + + expect(grid.selectedRows).toEqual([5, 14, 8]); // ids + expect(grid.rowSelectionChanging.emit).toHaveBeenCalledTimes(2); + expect(grid.rowSelectionChanging.emit).toHaveBeenCalledWith({ + added: [grid.dataView[2], grid.dataView[4]], + cancel: false, + event: jasmine.anything(), + newSelection: [grid.dataView[1], grid.dataView[2], grid.dataView[4]], + oldSelection: [grid.dataView[1]], + removed: [], + allRowsSelected: false, + owner: grid + }); + + const expectedSelectedRowIds = [5, 14, 8]; + grid.dataView.forEach((rowData, index) => { + if (expectedSelectedRowIds.includes(rowData.ProductID)) { + const row = grid.gridAPI.get_row_by_index(index); + GridSelectionFunctions.verifyRowSelected(row); + } + }); + + }); + it('Should NOT select multiple rows with Shift + Click when selectRowOnClick has false value', () => { grid.selectRowOnClick = false; spyOn(grid.rowSelectionChanging, 'emit').and.callThrough(); diff --git a/projects/igniteui-angular/src/lib/grids/selection/selection.service.ts b/projects/igniteui-angular/src/lib/grids/selection/selection.service.ts index d9201d2906d..4d6d8648837 100644 --- a/projects/igniteui-angular/src/lib/grids/selection/selection.service.ts +++ b/projects/igniteui-angular/src/lib/grids/selection/selection.service.ts @@ -689,7 +689,8 @@ export class IgxGridSelectionService { /** Returns all data in the grid, with applied filtering and sorting and without deleted rows. */ public get allData(): Array { let allData; - if (this.isFilteringApplied() || this.grid.sortingExpressions.length) { + // V.T. Jan 17th, 2024 #13757 Adding an additional conditional check to take account WITHIN range of groups + if (this.isFilteringApplied() || this.grid.sortingExpressions.length || this.grid.groupingExpressions?.length) { allData = this.grid.pinnedRecordsCount ? this.grid._filteredSortedUnpinnedData : this.grid.filteredSortedData; } else { allData = this.grid.gridAPI.get_all_data(true);