@@ -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 ) && ! this . grid . isDetailRecord ( 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 ) && ! this . grid . isDetailRecord ( 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 (
@@ -366,12 +385,14 @@ export class IgxGridNavigationService {
366385 }
367386
368387 public goToFirstCell ( ) {
388+ const targetIndex = this . findFirstDataRowIndex ( ) ;
389+ const targetScr = this . grid . verticalScrollContainer . getScrollForIndex ( targetIndex , false ) ;
369390 const verticalScroll = this . grid . verticalScrollContainer . getScroll ( ) ;
370- if ( verticalScroll . scrollTop === 0 ) {
391+ if ( verticalScroll . scrollTop === targetScr ) {
371392 this . onKeydownHome ( this . grid . dataRowList . first . index ) ;
372393 } else {
373394 this . getFocusableGrid ( ) . nativeElement . focus ( { preventScroll : true } ) ;
374- this . grid . verticalScrollContainer . scrollTo ( 0 ) ;
395+ this . grid . verticalScrollContainer . scrollTo ( targetIndex !== - 1 ? targetIndex : 0 ) ;
375396 this . grid . verticalScrollContainer . onChunkLoad
376397 . pipe ( first ( ) ) . subscribe ( ( ) => {
377398 this . onKeydownHome ( this . grid . dataRowList . first . index ) ;
@@ -380,15 +401,17 @@ export class IgxGridNavigationService {
380401 }
381402
382403 public goToLastCell ( ) {
404+ const targetIndex = this . findLastDataRowIndex ( ) ;
405+ const targetScr = this . grid . verticalScrollContainer . getScrollForIndex ( targetIndex , true ) ;
383406 const verticalScroll = this . grid . verticalScrollContainer . getScroll ( ) ;
384407 if ( verticalScroll . scrollHeight === 0 ||
385- verticalScroll . scrollTop === verticalScroll . scrollHeight - this . grid . verticalScrollContainer . igxForContainerSize ) {
408+ verticalScroll . scrollTop === targetScr ) {
386409 const rows = this . getAllRows ( ) ;
387410 const rowIndex = parseInt ( rows [ rows . length - 1 ] . getAttribute ( 'data-rowIndex' ) , 10 ) ;
388411 this . onKeydownEnd ( rowIndex ) ;
389412 } else {
390413 this . getFocusableGrid ( ) . nativeElement . focus ( { preventScroll : true } ) ;
391- this . grid . verticalScrollContainer . scrollTo ( this . grid . dataView . length - 1 ) ;
414+ this . grid . verticalScrollContainer . scrollTo ( targetIndex !== - 1 ? targetIndex : this . grid . dataView . length - 1 ) ;
392415 this . grid . verticalScrollContainer . onChunkLoad
393416 . pipe ( first ( ) ) . subscribe ( ( ) => {
394417 const rows = this . getAllRows ( ) ;
0 commit comments