Skip to content

Commit 43b5546

Browse files
Merge branch '18.0.x' into ganastasov/fix-14276-18.0.x
2 parents 36e072f + 8c0a495 commit 43b5546

File tree

7 files changed

+1993
-7
lines changed

7 files changed

+1993
-7
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-filtering-ui.spec.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2751,6 +2751,30 @@ describe('IgxGrid - Filtering Row UI actions #grid', () => {
27512751
filterUIRow = fix.debugElement.query(By.css(FILTER_UI_ROW));
27522752
expect(filterUIRow).toBeNull('Default filter template was found on a column with custom filtering.');
27532753
}));
2754+
2755+
it('Should not prevent mousedown event when target is within the filter cell template', fakeAsync(() => {
2756+
const filterCell = GridFunctions.getFilterCell(fix, 'ProductName');
2757+
const input = filterCell.query(By.css('input')).nativeElement;
2758+
2759+
const mousedownEvent = new MouseEvent('mousedown', { bubbles: true });
2760+
const preventDefaultSpy = spyOn(mousedownEvent, 'preventDefault');
2761+
input.dispatchEvent(mousedownEvent, { bubbles: true });
2762+
fix.detectChanges();
2763+
2764+
expect(preventDefaultSpy).not.toHaveBeenCalled();
2765+
}));
2766+
2767+
it('Should prevent mousedown event when target is filter cell or its parent elements', fakeAsync(() => {
2768+
const filteringCells = fix.debugElement.queryAll(By.css(FILTER_UI_CELL));
2769+
const firstCell = filteringCells[0].nativeElement;
2770+
2771+
const mousedownEvent = new MouseEvent('mousedown', { bubbles: true });
2772+
const preventDefaultSpy = spyOn(mousedownEvent, 'preventDefault');
2773+
firstCell.dispatchEvent(mousedownEvent);
2774+
fix.detectChanges();
2775+
2776+
expect(preventDefaultSpy).toHaveBeenCalled();
2777+
}));
27542778
});
27552779

27562780
describe(null, () => {
@@ -2827,6 +2851,7 @@ describe('IgxGrid - Filtering Row UI actions #grid', () => {
28272851

28282852
expect(grid.rowList.length).toEqual(1);
28292853
}));
2854+
28302855
});
28312856

28322857
describe('Filtering events', () => {

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/headers/grid-header-group.component.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -262,8 +262,12 @@ export class IgxGridHeaderGroupComponent implements DoCheck {
262262
*/
263263
@HostListener('mousedown', ['$event'])
264264
public onMouseDown(event: MouseEvent): void {
265-
// hack for preventing text selection in IE and Edge while dragging the resize element
266-
event.preventDefault();
265+
if (!this.grid.allowFiltering ||
266+
(event.composedPath().findIndex(el =>
267+
(el as Element).tagName?.toLowerCase() === 'igx-grid-filtering-cell') < 1)) {
268+
// Hack for preventing text selection in IE and Edge while dragging the resize element
269+
event.preventDefault();
270+
}
267271
}
268272

269273
/**

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)