Skip to content

Commit 32cc8e6

Browse files
authored
Merge branch '8.2.x' into pbozhinov/fix-5944-8.2
2 parents 4c2d8ae + f01e22b commit 32cc8e6

File tree

3 files changed

+45
-19
lines changed

3 files changed

+45
-19
lines changed

projects/igniteui-angular/src/lib/grids/common/grid.interface.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,5 @@ export interface GridType {
3333
lastEditableColumnIndex: number;
3434

3535
endEdit(commit: boolean, event?: Event): void;
36+
isGroupByRecord(rec: any): boolean;
3637
}

projects/igniteui-angular/src/lib/grids/grid-base.component.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5047,6 +5047,14 @@ export abstract class IgxGridBaseComponent extends DisplayDensityBase implements
50475047
this.selectionService.clearRowSelection(event) : this.selectionService.selectAllRows(event);
50485048
}
50495049

5050+
/**
5051+
* @hidden
5052+
* @internal
5053+
*/
5054+
public isGroupByRecord(rec) {
5055+
return false;
5056+
}
5057+
50505058
/**
50515059
* @hidden
50525060
*/

projects/igniteui-angular/src/lib/grids/grid-navigation.service.ts

Lines changed: 36 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -250,15 +250,17 @@ export class IgxGridNavigationService {
250250
}
251251

252252
public navigateTop(visibleColumnIndex) {
253+
const targetIndex = this.findFirstDataRowIndex();
253254
const verticalScroll = this.grid.verticalScrollContainer.getScroll();
254255
const cellSelector = this.getCellSelector(visibleColumnIndex);
255-
if (verticalScroll.scrollTop === 0) {
256+
const targetScr = this.grid.verticalScrollContainer.getScrollForIndex(targetIndex, false);
257+
if (targetScr >= verticalScroll.scrollTop) {
256258
const cells = this.grid.nativeElement.querySelectorAll(
257259
`${cellSelector}[data-visibleIndex="${visibleColumnIndex}"]`);
258260
(cells[0] as HTMLElement).focus();
259261
} else {
260262
this.getFocusableGrid().nativeElement.focus({ preventScroll: true });
261-
this.grid.verticalScrollContainer.scrollTo(0);
263+
this.grid.verticalScrollContainer.scrollTo(targetIndex !== -1 ? targetIndex : 0);
262264
this.grid.verticalScrollContainer.onChunkLoad
263265
.pipe(first()).subscribe(() => {
264266
const cells = this.grid.nativeElement.querySelectorAll(
@@ -268,17 +270,34 @@ export class IgxGridNavigationService {
268270
}
269271
}
270272

273+
private findFirstDataRowIndex() {
274+
const dv = this.grid.dataView;
275+
return dv.findIndex(rec => !this.grid.isGroupByRecord(rec));
276+
}
277+
278+
private findLastDataRowIndex() {
279+
let i = this.grid.dataView.length;
280+
while (i--) {
281+
const rec = this.grid.dataView[i];
282+
if (!this.grid.isGroupByRecord(rec)) {
283+
return i;
284+
}
285+
}
286+
}
287+
271288
public navigateBottom(visibleColumnIndex) {
289+
const targetIndex = this.findLastDataRowIndex();
290+
const targetScr = this.grid.verticalScrollContainer.getScrollForIndex(targetIndex, true);
272291
const verticalScroll = this.grid.verticalScrollContainer.getScroll();
273292
const cellSelector = this.getCellSelector(visibleColumnIndex);
274293
if (verticalScroll.scrollHeight === 0 ||
275-
verticalScroll.scrollTop === verticalScroll.scrollHeight - this.grid.verticalScrollContainer.igxForContainerSize) {
294+
verticalScroll.scrollTop === targetScr) {
276295
const cells = this.grid.nativeElement.querySelectorAll(
277296
`${cellSelector}[data-visibleIndex="${visibleColumnIndex}"]`);
278297
(cells[cells.length - 1] as HTMLElement).focus();
279298
} else {
280299
this.getFocusableGrid().nativeElement.focus({ preventScroll: true });
281-
this.grid.verticalScrollContainer.scrollTo(this.grid.dataView.length - 1);
300+
this.grid.verticalScrollContainer.scrollTo(targetIndex !== -1 ? targetIndex : this.grid.dataView.length - 1);
282301
this.grid.verticalScrollContainer.onChunkLoad
283302
.pipe(first()).subscribe(() => {
284303
const cells = this.grid.nativeElement.querySelectorAll(
@@ -372,35 +391,33 @@ export class IgxGridNavigationService {
372391
}
373392

374393
public goToFirstCell() {
394+
const targetIndex = this.findFirstDataRowIndex();
395+
const targetScr = this.grid.verticalScrollContainer.getScrollForIndex(targetIndex, false);
375396
const verticalScroll = this.grid.verticalScrollContainer.getScroll();
376-
const horizontalScroll = this.grid.dataRowList.first.virtDirRow.getScroll();
377-
if (verticalScroll.scrollTop === 0) {
397+
if (verticalScroll.scrollTop === targetScr) {
378398
this.onKeydownHome(this.grid.dataRowList.first.index);
379399
} else {
380-
if (!horizontalScroll.clientWidth || parseInt(horizontalScroll.scrollLeft, 10) <= 1 || this.grid.pinnedColumns.length) {
381-
this.navigateTop(0);
382-
} else {
383-
this.getFocusableGrid().nativeElement.focus({ preventScroll: true });
384-
this.horizontalScroll(this.grid.dataRowList.first.index).scrollTo(0);
385-
this.grid.parentVirtDir.onChunkLoad
386-
.pipe(first())
387-
.subscribe(() => {
388-
this.navigateTop(0);
389-
});
390-
}
400+
this.getFocusableGrid().nativeElement.focus({ preventScroll: true });
401+
this.grid.verticalScrollContainer.scrollTo(targetIndex !== -1 ? targetIndex : 0);
402+
this.grid.verticalScrollContainer.onChunkLoad
403+
.pipe(first()).subscribe(() => {
404+
this.onKeydownHome(this.grid.dataRowList.first.index);
405+
});
391406
}
392407
}
393408

394409
public goToLastCell() {
410+
const targetIndex = this.findLastDataRowIndex();
411+
const targetScr = this.grid.verticalScrollContainer.getScrollForIndex(targetIndex, true);
395412
const verticalScroll = this.grid.verticalScrollContainer.getScroll();
396413
if (verticalScroll.scrollHeight === 0 ||
397-
verticalScroll.scrollTop === verticalScroll.scrollHeight - this.grid.verticalScrollContainer.igxForContainerSize) {
414+
verticalScroll.scrollTop === targetScr) {
398415
const rows = this.getAllRows();
399416
const rowIndex = parseInt(rows[rows.length - 1].getAttribute('data-rowIndex'), 10);
400417
this.onKeydownEnd(rowIndex);
401418
} else {
402419
this.getFocusableGrid().nativeElement.focus({ preventScroll: true });
403-
this.grid.verticalScrollContainer.scrollTo(this.grid.dataView.length - 1);
420+
this.grid.verticalScrollContainer.scrollTo(targetIndex !== -1 ? targetIndex : this.grid.dataView.length - 1);
404421
this.grid.verticalScrollContainer.onChunkLoad
405422
.pipe(first()).subscribe(() => {
406423
const rows = this.getAllRows();

0 commit comments

Comments
 (0)