Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(for-of): correct content area recalculation - 17.2.x #14462

Merged
merged 8 commits into from
Jul 12, 2024
Original file line number Diff line number Diff line change
Expand Up @@ -798,7 +798,6 @@ export class IgxForOfDirective<T, U extends T[] = T[]> extends IgxForOfToken<T,U
|| containerSize && endTopOffset - containerSize > 5;
}


/**
* @hidden
* Function that recalculates and updates cache sizes.
Expand Down Expand Up @@ -827,13 +826,13 @@ export class IgxForOfDirective<T, U extends T[] = T[]> extends IgxForOfToken<T,U
const currDiff = newVal - oldVal;
diffs.push(currDiff);
totalDiff += currDiff;
this.sizesCache[index + 1] += totalDiff;
this.sizesCache[index + 1] = (this.sizesCache[index] || 0) + newVal;
}
}
// update cache
if (Math.abs(totalDiff) > 0) {
for (let j = this.state.startIndex + this.state.chunkSize + 1; j < this.sizesCache.length; j++) {
this.sizesCache[j] += totalDiff;
this.sizesCache[j] = (this.sizesCache[j] || 0) + totalDiff;
}

// update scrBar heights/widths
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -590,13 +590,14 @@ describe('IgxGrid Master Detail #grid', () => {
setupGridScrollDetection(fix, grid);
const targetCellElement = grid.gridAPI.get_cell_by_index(0, 'ContactName');
UIInteractions.simulateClickAndSelectEvent(targetCellElement);
await wait(DEBOUNCETIME);
fix.detectChanges();

UIInteractions.triggerEventHandlerKeyDown('End', gridContent, false, false, true);
await wait(DEBOUNCETIME);
fix.detectChanges();
await wait(DEBOUNCETIME);
fix.detectChanges();
await wait(DEBOUNCETIME);

const lastRow = grid.gridAPI.get_row_by_index(52);
expect(lastRow).not.toBeUndefined();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import { IgxStringFilteringOperand } from '../../data-operations/filtering-condi
import { GridFunctions } from '../../test-utils/grid-functions.spec';
import { HierarchicalGridFunctions } from '../../test-utils/hierarchical-grid-functions.spec';
import { IgxHierarchicalRowComponent } from './hierarchical-row.component';
import { IgxHierarchicalGridDefaultComponent } from '../../test-utils/hierarchical-grid-components.spec';

describe('IgxHierarchicalGrid Virtualization #hGrid', () => {
let fixture;
Expand All @@ -22,7 +23,8 @@ describe('IgxHierarchicalGrid Virtualization #hGrid', () => {
return TestBed.configureTestingModule({
imports: [
NoopAnimationsModule,
IgxHierarchicalGridTestBaseComponent
IgxHierarchicalGridTestBaseComponent,
IgxHierarchicalGridDefaultComponent
]
});
}));
Expand Down Expand Up @@ -393,6 +395,45 @@ describe('IgxHierarchicalGrid Virtualization #hGrid', () => {
expect(ri.gridScroll.emit).toHaveBeenCalled();
expect(ri.dataPreLoad.emit).toHaveBeenCalled();
});

it('should recalculate and update content correctly after filter is cleared, ensuring no empty areas post-filtering and scrolling', async () => {
// eslint-disable-next-line @typescript-eslint/no-shadow
const fixture = TestBed.createComponent(IgxHierarchicalGridDefaultComponent);
fixture.detectChanges();
// eslint-disable-next-line @typescript-eslint/no-shadow
const hierarchicalGrid = fixture.componentInstance.hierarchicalGrid;
fixture.detectChanges();
await wait(50);

hierarchicalGrid.filter('Artist', 'd', IgxStringFilteringOperand.instance().condition('contains'));
fixture.detectChanges();
await wait(50);

hierarchicalGrid.expandRow(6);
fixture.detectChanges();
await wait(50);

hierarchicalGrid.verticalScrollContainer.getScroll().scrollTop = 2000;
fixture.detectChanges();
await wait(50);

hierarchicalGrid.clearFilter();
fixture.detectChanges();
await wait(50);

hierarchicalGrid.verticalScrollContainer.getScroll().scrollTop = 2000;
fixture.detectChanges();
await wait(50);
fixture.detectChanges();
await wait(50);

const hierarchicalGridRect = hierarchicalGrid.tbody.nativeElement.getBoundingClientRect();
const lastRowRect = hierarchicalGrid.dataRowList.last.nativeElement.getBoundingClientRect();

const emptySpace = hierarchicalGridRect.bottom - lastRowRect.bottom;

expect(emptySpace).toBeLessThan(5);
});
});

describe('IgxHierarchicalGrid Virtualization Custom Scenarios #hGrid', () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -687,3 +687,47 @@ class MyChildSummary {
return result;
}
}

@Component({
template: `
<igx-hierarchical-grid [data]="data" [autoGenerate]="false" [allowFiltering]='true'
[height]="'600px'" [width]="'100%'" [rowHeight]="'65px'" [primaryKey]="'ID'" #hierarchicalGrid>
<igx-column field="ID" [hidden]="true"></igx-column>
<igx-column field="Artist"></igx-column>
<igx-column field="Debut" dataType="number"></igx-column>
<igx-column field="GrammyNominations" header="Grammy Nominations" dataType="number"></igx-column>
<igx-column field="GrammyAwards" header="Grammy Awards" dataType="number"></igx-column>

<igx-row-island [height]="null" [key]="'Albums'" [autoGenerate]="false" [allowFiltering]='true'>
<igx-column field="Album"></igx-column>
<igx-column field="LaunchDate" header="Launch Date" [dataType]="'date'"></igx-column>
<igx-column field="BillboardReview" header="Billboard Review" dataType="number"></igx-column>
<igx-column field="USBillboard200" header="US Billboard 200" dataType="number"></igx-column>
<igx-row-island [height]="null" [key]="'Songs'" [autoGenerate]="false" >
<igx-column field="Number" header="No."></igx-column>
<igx-column field="Title"></igx-column>
<igx-column field="Released" dataType="date"></igx-column>
<igx-column field="Genre"></igx-column>
</igx-row-island>
</igx-row-island>

<igx-row-island [height]="null" [key]="'Tours'" [autoGenerate]="false" [allowFiltering]='true'>
<igx-column field="Tour"></igx-column>
<igx-column field="StartedOn" header="Started on"></igx-column>
<igx-column field="Location"></igx-column>
<igx-column field="Headliner"></igx-column>
</igx-row-island>
</igx-hierarchical-grid>`,
standalone: true,
imports: [IgxHierarchicalGridComponent, IgxColumnComponent, IgxRowIslandComponent]
})
export class IgxHierarchicalGridDefaultComponent {
@ViewChild('hierarchicalGrid', { read: IgxHierarchicalGridComponent, static: true })
public hierarchicalGrid: IgxHierarchicalGridComponent;

public data;

constructor() {
this.data = SampleTestData.hierarchicalGridSingersFullData();
}
}
Loading
Loading