Skip to content

Commit 3c19be2

Browse files
Merge pull request #14460 from IgniteUI/ganastasov/fix-14324-master
fix(for-of): correct content area recalculation - master
2 parents b829e4d + 7b25cbe commit 3c19be2

File tree

5 files changed

+1962
-5
lines changed

5 files changed

+1962
-5
lines changed

projects/igniteui-angular/src/lib/directives/for-of/for_of.directive.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -802,7 +802,6 @@ export class IgxForOfDirective<T, U extends T[] = T[]> extends IgxForOfToken<T,U
802802
|| containerSize && endTopOffset - containerSize > 5;
803803
}
804804

805-
806805
/**
807806
* @hidden
808807
* Function that recalculates and updates cache sizes.
@@ -831,13 +830,13 @@ export class IgxForOfDirective<T, U extends T[] = T[]> extends IgxForOfToken<T,U
831830
const currDiff = newVal - oldVal;
832831
diffs.push(currDiff);
833832
totalDiff += currDiff;
834-
this.sizesCache[index + 1] += totalDiff;
833+
this.sizesCache[index + 1] = (this.sizesCache[index] || 0) + newVal;
835834
}
836835
}
837836
// update cache
838837
if (Math.abs(totalDiff) > 0) {
839838
for (let j = this.state.startIndex + this.state.chunkSize + 1; j < this.sizesCache.length; j++) {
840-
this.sizesCache[j] += totalDiff;
839+
this.sizesCache[j] = (this.sizesCache[j] || 0) + totalDiff;
841840
}
842841

843842
// update scrBar heights/widths

projects/igniteui-angular/src/lib/grids/grid/grid.master-detail.spec.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -590,13 +590,14 @@ describe('IgxGrid Master Detail #grid', () => {
590590
setupGridScrollDetection(fix, grid);
591591
const targetCellElement = grid.gridAPI.get_cell_by_index(0, 'ContactName');
592592
UIInteractions.simulateClickAndSelectEvent(targetCellElement);
593+
await wait(DEBOUNCETIME);
593594
fix.detectChanges();
594595

595596
UIInteractions.triggerEventHandlerKeyDown('End', gridContent, false, false, true);
596-
await wait(DEBOUNCETIME);
597597
fix.detectChanges();
598598
await wait(DEBOUNCETIME);
599599
fix.detectChanges();
600+
await wait(DEBOUNCETIME);
600601

601602
const lastRow = grid.gridAPI.get_row_by_index(52);
602603
expect(lastRow).not.toBeUndefined();

projects/igniteui-angular/src/lib/grids/hierarchical-grid/hierarchical-grid.virtualization.spec.ts

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { IgxStringFilteringOperand } from '../../data-operations/filtering-condi
1414
import { GridFunctions } from '../../test-utils/grid-functions.spec';
1515
import { HierarchicalGridFunctions } from '../../test-utils/hierarchical-grid-functions.spec';
1616
import { IgxHierarchicalRowComponent } from './hierarchical-row.component';
17+
import { IgxHierarchicalGridDefaultComponent } from '../../test-utils/hierarchical-grid-components.spec';
1718

1819
describe('IgxHierarchicalGrid Virtualization #hGrid', () => {
1920
let fixture;
@@ -22,7 +23,8 @@ describe('IgxHierarchicalGrid Virtualization #hGrid', () => {
2223
return TestBed.configureTestingModule({
2324
imports: [
2425
NoopAnimationsModule,
25-
IgxHierarchicalGridTestBaseComponent
26+
IgxHierarchicalGridTestBaseComponent,
27+
IgxHierarchicalGridDefaultComponent
2628
]
2729
});
2830
}));
@@ -393,6 +395,43 @@ describe('IgxHierarchicalGrid Virtualization #hGrid', () => {
393395
expect(ri.gridScroll.emit).toHaveBeenCalled();
394396
expect(ri.dataPreLoad.emit).toHaveBeenCalled();
395397
});
398+
399+
it('should recalculate and update content correctly after filter is cleared, ensuring no empty areas post-filtering and scrolling', async () => {
400+
// eslint-disable-next-line @typescript-eslint/no-shadow
401+
const fixture = TestBed.createComponent(IgxHierarchicalGridDefaultComponent);
402+
fixture.detectChanges();
403+
// eslint-disable-next-line @typescript-eslint/no-shadow
404+
const hierarchicalGrid = fixture.componentInstance.hierarchicalGrid;
405+
fixture.detectChanges();
406+
await wait(50);
407+
408+
hierarchicalGrid.filter('Artist', 'd', IgxStringFilteringOperand.instance().condition('contains'));
409+
fixture.detectChanges();
410+
await wait(50);
411+
412+
hierarchicalGrid.expandRow(6);
413+
fixture.detectChanges();
414+
await wait(50);
415+
416+
hierarchicalGrid.verticalScrollContainer.getScroll().scrollTop = 2000;
417+
fixture.detectChanges();
418+
await wait(50);
419+
420+
hierarchicalGrid.clearFilter();
421+
fixture.detectChanges();
422+
await wait(50);
423+
424+
hierarchicalGrid.verticalScrollContainer.getScroll().scrollTop = 2000;
425+
fixture.detectChanges();
426+
await wait(50);
427+
428+
const hierarchicalGridRect = hierarchicalGrid.tbody.nativeElement.getBoundingClientRect();
429+
const lastRowRect = hierarchicalGrid.dataRowList.last.nativeElement.getBoundingClientRect();
430+
431+
const emptySpace = hierarchicalGridRect.bottom - lastRowRect.bottom;
432+
433+
expect(emptySpace).toBeLessThan(5);
434+
});
396435
});
397436

398437
describe('IgxHierarchicalGrid Virtualization Custom Scenarios #hGrid', () => {

projects/igniteui-angular/src/lib/test-utils/hierarchical-grid-components.spec.ts

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -687,3 +687,47 @@ class MyChildSummary {
687687
return result;
688688
}
689689
}
690+
691+
@Component({
692+
template: `
693+
<igx-hierarchical-grid [data]="data" [autoGenerate]="false" [allowFiltering]='true'
694+
[height]="'600px'" [width]="'100%'" [rowHeight]="'65px'" [primaryKey]="'ID'" #hierarchicalGrid>
695+
<igx-column field="ID" [hidden]="true"></igx-column>
696+
<igx-column field="Artist"></igx-column>
697+
<igx-column field="Debut" dataType="number"></igx-column>
698+
<igx-column field="GrammyNominations" header="Grammy Nominations" dataType="number"></igx-column>
699+
<igx-column field="GrammyAwards" header="Grammy Awards" dataType="number"></igx-column>
700+
701+
<igx-row-island [height]="null" [key]="'Albums'" [autoGenerate]="false" [allowFiltering]='true'>
702+
<igx-column field="Album"></igx-column>
703+
<igx-column field="LaunchDate" header="Launch Date" [dataType]="'date'"></igx-column>
704+
<igx-column field="BillboardReview" header="Billboard Review" dataType="number"></igx-column>
705+
<igx-column field="USBillboard200" header="US Billboard 200" dataType="number"></igx-column>
706+
<igx-row-island [height]="null" [key]="'Songs'" [autoGenerate]="false" >
707+
<igx-column field="Number" header="No."></igx-column>
708+
<igx-column field="Title"></igx-column>
709+
<igx-column field="Released" dataType="date"></igx-column>
710+
<igx-column field="Genre"></igx-column>
711+
</igx-row-island>
712+
</igx-row-island>
713+
714+
<igx-row-island [height]="null" [key]="'Tours'" [autoGenerate]="false" [allowFiltering]='true'>
715+
<igx-column field="Tour"></igx-column>
716+
<igx-column field="StartedOn" header="Started on"></igx-column>
717+
<igx-column field="Location"></igx-column>
718+
<igx-column field="Headliner"></igx-column>
719+
</igx-row-island>
720+
</igx-hierarchical-grid>`,
721+
standalone: true,
722+
imports: [IgxHierarchicalGridComponent, IgxColumnComponent, IgxRowIslandComponent]
723+
})
724+
export class IgxHierarchicalGridDefaultComponent {
725+
@ViewChild('hierarchicalGrid', { read: IgxHierarchicalGridComponent, static: true })
726+
public hierarchicalGrid: IgxHierarchicalGridComponent;
727+
728+
public data;
729+
730+
constructor() {
731+
this.data = SampleTestData.hierarchicalGridSingersFullData();
732+
}
733+
}

0 commit comments

Comments
 (0)