@@ -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