Skip to content

Commit c717bcc

Browse files
authored
Merge pull request #8621 from IgniteUI/skrastev/fix-8587-10.2.x
fix(igxGrid): Fix adding row recreates row forOf directive due to template change.
2 parents 33685a0 + 4b8665f commit c717bcc

File tree

3 files changed

+75
-13
lines changed

3 files changed

+75
-13
lines changed

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

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3254,6 +3254,17 @@ export abstract class IgxGridBaseDirective extends DisplayDensityBase implements
32543254
}
32553255
}
32563256

3257+
/**
3258+
* @hidden @internal
3259+
*/
3260+
public resetHorizontalForOfs() {
3261+
const elementFilter = (item: IgxRowDirective<any> | IgxSummaryRowComponent) => this.isDefined(item.nativeElement.parentElement);
3262+
this._horizontalForOfs = [
3263+
...this._dataRowList.filter(elementFilter).map(item => item.virtDirRow),
3264+
...this._summaryRowList.filter(elementFilter).map(item => item.virtDirRow)
3265+
];
3266+
}
3267+
32573268
/**
32583269
* @hidden @internal
32593270
*/
@@ -3262,15 +3273,9 @@ export abstract class IgxGridBaseDirective extends DisplayDensityBase implements
32623273
const extractForOfs = pipe(map((collection: any[]) => collection.filter(elementFilter).map(item => item.virtDirRow)));
32633274
const rowListObserver = extractForOfs(this._dataRowList.changes);
32643275
const summaryRowObserver = extractForOfs(this._summaryRowList.changes);
3265-
const resetHorizontalForOfs = () => {
3266-
this._horizontalForOfs = [
3267-
...this._dataRowList.filter(elementFilter).map(item => item.virtDirRow),
3268-
...this._summaryRowList.filter(elementFilter).map(item => item.virtDirRow)
3269-
];
3270-
};
3271-
rowListObserver.pipe(takeUntil(this.destroy$)).subscribe(resetHorizontalForOfs);
3272-
summaryRowObserver.pipe(takeUntil(this.destroy$)).subscribe(resetHorizontalForOfs);
3273-
resetHorizontalForOfs();
3276+
rowListObserver.pipe(takeUntil(this.destroy$)).subscribe(() => { this.resetHorizontalForOfs(); });
3277+
summaryRowObserver.pipe(takeUntil(this.destroy$)).subscribe(() => { this.resetHorizontalForOfs(); });
3278+
this.resetHorizontalForOfs();
32743279
}
32753280

32763281
/**

projects/igniteui-angular/src/lib/grids/grid/grid-add-row.spec.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ import { Subject } from 'rxjs';
2424

2525

2626
describe('IgxGrid - Row Adding #grid', () => {
27+
const GRID_ROW = 'igx-grid-row';
28+
const DISPLAY_CONTAINER = 'igx-display-container';
2729
const SUMMARY_ROW = 'igx-grid-summary-row';
2830
let fixture;
2931
let grid: IgxGridComponent;
@@ -547,6 +549,42 @@ describe('IgxGrid - Row Adding #grid', () => {
547549
expect(newRow.addRow).toBeFalse();
548550
expect(grid.data.length).toBe(dataLength + 1);
549551
});
552+
553+
it('Should correctly scroll all rows after closing the add row', async() => {
554+
grid.width = '400px';
555+
fixture.detectChanges();
556+
557+
const dataLength = grid.data.length;
558+
const row = grid.rowList.first;
559+
row.beginAddRow();
560+
fixture.detectChanges();
561+
562+
endTransition();
563+
564+
let newRow = grid.getRowByIndex(1);
565+
expect(newRow.addRow).toBeTrue();
566+
567+
const cancelButtonElement = GridFunctions.getRowEditingCancelButton(fixture);
568+
cancelButtonElement.click();
569+
fixture.detectChanges();
570+
await wait(100);
571+
fixture.detectChanges();
572+
573+
newRow = grid.getRowByIndex(1);
574+
expect(newRow.addRow).toBeFalse();
575+
expect(grid.data.length).toBe(dataLength);
576+
577+
(grid as any).scrollTo(0, grid.columnList.length - 1);
578+
await wait(100);
579+
fixture.detectChanges();
580+
581+
// All rows should be scrolled, from their forOf directive. If not then the `_horizontalForOfs` in the grid is outdated.
582+
const gridRows = fixture.debugElement.queryAll(By.css(GRID_ROW));
583+
gridRows.forEach(item => {
584+
const displayContainer = item.query(By.css(DISPLAY_CONTAINER));
585+
expect(displayContainer.nativeElement.style.left).not.toBe('0px');
586+
});
587+
});
550588
});
551589

552590
describe('Row Adding - Paging tests', () => {

projects/igniteui-angular/src/lib/grids/row.directive.ts

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ import {
1111
ViewChildren,
1212
Directive,
1313
Output,
14-
EventEmitter
14+
EventEmitter,
15+
AfterViewInit,
16+
OnDestroy
1517
} from '@angular/core';
1618
import { IgxCheckboxComponent } from '../checkbox/checkbox.component';
1719
import { IgxGridForOfDirective } from '../directives/for-of/for_of.directive';
@@ -22,11 +24,13 @@ import { IgxGridBaseDirective } from './grid-base.directive';
2224
import { IgxGridSelectionService, IgxGridCRUDService, IgxRow } from './selection/selection.service';
2325
import { GridType } from './common/grid.interface';
2426
import merge from 'lodash.merge';
27+
import { Subject } from 'rxjs';
28+
import { takeUntil } from 'rxjs/operators';
2529

2630
@Directive({
2731
selector: '[igxRowBaseComponent]'
2832
})
29-
export class IgxRowDirective<T extends IgxGridBaseDirective & GridType> implements DoCheck {
33+
export class IgxRowDirective<T extends IgxGridBaseDirective & GridType> implements DoCheck, AfterViewInit, OnDestroy {
3034

3135
protected _rowData: any;
3236
protected _addRow: boolean;
@@ -140,8 +144,12 @@ export class IgxRowDirective<T extends IgxGridBaseDirective & GridType> implemen
140144
/**
141145
* @hidden
142146
*/
143-
@ViewChild('igxDirRef', { read: IgxGridForOfDirective })
144-
public virtDirRow: IgxGridForOfDirective<any>;
147+
@ViewChildren('igxDirRef', { read: IgxGridForOfDirective })
148+
public _virtDirRow: QueryList<IgxGridForOfDirective<any>>;
149+
150+
public get virtDirRow(): IgxGridForOfDirective<any> {
151+
return this._virtDirRow ? this._virtDirRow.first : null;
152+
}
145153

146154
/**
147155
* @hidden
@@ -370,6 +378,7 @@ export class IgxRowDirective<T extends IgxGridBaseDirective & GridType> implemen
370378
*/
371379
public defaultCssClass = 'igx-grid__tr';
372380

381+
protected destroy$ = new Subject<any>();
373382

374383
constructor(
375384
public gridAPI: GridBaseAPIService<T>,
@@ -378,6 +387,16 @@ export class IgxRowDirective<T extends IgxGridBaseDirective & GridType> implemen
378387
public element: ElementRef<HTMLElement>,
379388
public cdr: ChangeDetectorRef) {}
380389

390+
public ngAfterViewInit() {
391+
// If the template of the row changes, the forOf in it is recreated and is not detected by the grid and rows can't be scrolled.
392+
this._virtDirRow.changes.pipe(takeUntil(this.destroy$)).subscribe(() => this.grid.resetHorizontalForOfs());
393+
}
394+
395+
public ngOnDestroy() {
396+
this.destroy$.next(true);
397+
this.destroy$.complete();
398+
}
399+
381400
/**
382401
* @hidden
383402
* @internal

0 commit comments

Comments
 (0)