Skip to content

Commit 9e03ece

Browse files
authored
Merge pull request #5538 from IgniteUI/astaev/issue4967-8.1.x
fix(filtering): Refactor the grid filtering row #4967
2 parents e948a41 + 2bcbe15 commit 9e03ece

File tree

3 files changed

+53
-40
lines changed

3 files changed

+53
-40
lines changed

projects/igniteui-angular/src/lib/grids/filtering/grid-filtering-row.component.html

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,9 +87,8 @@
8787
<ng-container *ngFor="let item of expressionsList; index as i; let last = last;" tabindex="0">
8888
<igx-chip #chip id='chip'
8989
(pointerdown)="onChipPointerdown($event, chip)"
90-
(click)="onChipClick($event, chip)"
91-
(onSelection)="onChipSelected($event, item.expression)"
92-
(keydown)="onChipKeyDown($event, chip)"
90+
(click)="onChipClick($event, item)"
91+
(keydown)="onChipKeyDown($event, item)"
9392
(onRemove)="onChipRemoved($event, item)"
9493
[selectable]="false"
9594
[selected]="item.isSelected"

projects/igniteui-angular/src/lib/grids/filtering/grid-filtering-row.component.ts

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -75,11 +75,13 @@ export class IgxGridFilteringRowComponent implements AfterViewInit {
7575
}
7676

7777
set column(val) {
78+
if (this._column) {
79+
this.expressionsList.forEach(exp => exp.isSelected = false);
80+
}
7881
if (val) {
7982
this._column = val;
8083

8184
this.expressionsList = this.filteringService.getExpressions(this._column.field);
82-
8385
this.resetExpression();
8486

8587
this.chipAreaScrollOffset = 0;
@@ -148,6 +150,11 @@ export class IgxGridFilteringRowComponent implements AfterViewInit {
148150
this._conditionsOverlaySettings.outlet = this.column.grid.outletDirective;
149151
this._operatorsOverlaySettings.outlet = this.column.grid.outletDirective;
150152

153+
const selectedItem = this.expressionsList.find(expr => expr.isSelected === true);
154+
if (selectedItem) {
155+
this.expression = selectedItem.expression;
156+
}
157+
151158
this.input.nativeElement.focus();
152159
}
153160

@@ -364,8 +371,8 @@ export class IgxGridFilteringRowComponent implements AfterViewInit {
364371
* Commits the value of the input.
365372
*/
366373
public commitInput() {
367-
this.expressionsList.forEach(ex => ex.isSelected = false);
368-
this.chipsArea.chipsList.forEach(chip => chip.selected = false);
374+
const selectedItem = this.expressionsList.filter(ex => ex.isSelected === true);
375+
selectedItem.forEach(e => e.isSelected = false);
369376

370377
let indexToDeselect = -1;
371378
for (let index = 0; index < this.expressionsList.length; index++) {
@@ -435,8 +442,8 @@ export class IgxGridFilteringRowComponent implements AfterViewInit {
435442
}
436443
requestAnimationFrame(() => {
437444
const focusedElement = document.activeElement;
438-
if (!(focusedElement && this.inputGroup.nativeElement.contains(focusedElement)) &&
439-
this.dropDownConditions.collapsed) {
445+
if (!(focusedElement && this.inputGroup.nativeElement.contains(focusedElement))
446+
&& this.dropDownConditions.collapsed) {
440447
this.commitInput();
441448
}
442449
});
@@ -527,44 +534,37 @@ export class IgxGridFilteringRowComponent implements AfterViewInit {
527534
this._cancelChipClick = chip.selected && activeElement && this.inputGroup.nativeElement.contains(activeElement);
528535
}
529536

530-
public onChipClick(args, chip: IgxChipComponent) {
537+
public onChipClick(args, item: ExpressionUI) {
531538
if (this._cancelChipClick) {
532539
return;
533540
}
534541

535542
this._cancelChipClick = false;
536-
chip.selected = !chip.selected;
543+
544+
this.expressionsList.forEach(ex => ex.isSelected = false);
545+
546+
this.toggleChip(item);
537547
}
538548

539-
/**
540-
* Event handler for chip selected event.
541-
*/
542-
public onChipSelected(eventArgs: IChipSelectEventArgs, expression: IFilteringExpression) {
543-
if (eventArgs.selected) {
544-
if (this.chipsArea.chipsList) {
545-
this.chipsArea.chipsList.forEach((chip) => {
546-
if (chip !== eventArgs.owner) {
547-
chip.selected = false;
548-
}
549-
});
550-
}
551-
this.expression = expression;
549+
public toggleChip(item: ExpressionUI) {
550+
item.isSelected = !item.isSelected;
551+
if (item.isSelected) {
552+
this.expression = item.expression;
552553

553554
if (this.input) {
554555
this.input.nativeElement.focus();
555556
}
556-
} else if (this.expression === expression) {
557-
this.resetExpression();
558557
}
559558
}
560559

561560
/**
562561
* Event handler for chip keydown event.
563562
*/
564-
public onChipKeyDown(eventArgs: KeyboardEvent, chip: IgxChipComponent) {
563+
public onChipKeyDown(eventArgs: KeyboardEvent, item: ExpressionUI) {
565564
if (eventArgs.key === KEYS.ENTER) {
566565
eventArgs.preventDefault();
567-
chip.selected = !chip.selected;
566+
567+
this.toggleChip(item);
568568
}
569569
}
570570

projects/igniteui-angular/src/lib/grids/grid/grid-filtering-ui.spec.ts

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1563,8 +1563,8 @@ describe('IgxGrid - Filtering actions', () => {
15631563

15641564
reset.nativeElement.focus();
15651565
inputGroup.nativeElement.dispatchEvent(new FocusEvent('focusout'));
1566+
await wait(100);
15661567
fix.detectChanges();
1567-
await wait(16);
15681568

15691569
expect(filterChip.componentInstance.selected).toBeFalsy();
15701570
});
@@ -1594,19 +1594,22 @@ describe('IgxGrid - Filtering actions', () => {
15941594
expect(filterChip).toBeTruthy();
15951595
expect(filterChip.componentInstance.selected).toBeTruthy();
15961596

1597-
filterChip.nativeElement.dispatchEvent(new MouseEvent('click'));
1597+
// Click on the chip to commit it
1598+
clickElemAndBlur(filterChip, input);
1599+
await wait(200);
15981600
fix.detectChanges();
1599-
await wait(16);
16001601
expect(filterChip.componentInstance.selected).toBeFalsy();
16011602

1602-
filterChip.nativeElement.dispatchEvent(new MouseEvent('click'));
1603+
// Click on the chip to select it
1604+
GridFunctions.clickChip(filterChip);
16031605
fix.detectChanges();
1604-
await wait(16);
1606+
await wait(100);
16051607
expect(filterChip.componentInstance.selected).toBeTruthy();
16061608

1607-
filterChip.nativeElement.dispatchEvent(new MouseEvent('click'));
1609+
// Click on the chip to commit it
1610+
clickElemAndBlur(filterChip, input);
1611+
await wait(100);
16081612
fix.detectChanges();
1609-
await wait(16);
16101613
expect(filterChip.componentInstance.selected).toBeFalsy();
16111614
});
16121615

@@ -1624,34 +1627,35 @@ describe('IgxGrid - Filtering actions', () => {
16241627
expect(filterChip).toBeTruthy();
16251628
expect(filterChip.componentInstance.selected).toBeTruthy();
16261629

1627-
filterChip.nativeElement.dispatchEvent(new MouseEvent('click'));
1630+
// Click on the chip to commit it
1631+
clickElemAndBlur(filterChip, input);
16281632
fix.detectChanges();
1629-
await wait(16);
1633+
await wait(100);
16301634
expect(filterChip.componentInstance.selected).toBeFalsy();
16311635

16321636
filterValue = 'c';
16331637
sendInput(input, filterValue, fix);
16341638
fix.detectChanges();
1635-
await wait(16);
1639+
await wait(100);
16361640

16371641
let filterChips = filterUIRow.queryAll(By.directive(IgxChipComponent));
16381642
expect(filterChips[1]).toBeTruthy();
16391643
expect(filterChips[1].componentInstance.selected).toBeTruthy();
16401644

16411645
GridFunctions.simulateKeyboardEvent(input, 'keydown', 'Enter');
16421646
fix.detectChanges();
1643-
await wait(16);
1647+
await wait(100);
16441648
expect(filterChips[1].componentInstance.selected).toBeFalsy();
16451649

16461650
let selectedColumn = GridFunctions.getColumnHeader('Downloads', fix);
16471651
selectedColumn.nativeElement.dispatchEvent(new MouseEvent('click'));
16481652
fix.detectChanges();
1649-
await wait(16);
1653+
await wait(100);
16501654

16511655
selectedColumn = GridFunctions.getColumnHeader('ProductName', fix);
16521656
selectedColumn.nativeElement.dispatchEvent(new MouseEvent('click'));
16531657
fix.detectChanges();
1654-
await wait(16);
1658+
await wait(100);
16551659

16561660
filterChips = filterUIRow.queryAll(By.directive(IgxChipComponent));
16571661
expect(filterChips[0].componentInstance.selected).toBeFalsy();
@@ -6080,3 +6084,13 @@ function verifyChipVisibility(fix, index: number, shouldBeFullyVisible: boolean)
60806084
expect(chipRect.left >= visibleChipAreaRect.left && chipRect.right <= visibleChipAreaRect.right)
60816085
.toBe(shouldBeFullyVisible, 'chip[' + index + '] visibility is incorrect');
60826086
}
6087+
6088+
function clickElemAndBlur(clickElem, blurElem) {
6089+
const elementRect = clickElem.nativeElement.getBoundingClientRect();
6090+
UIInteractions.simulatePointerEvent('pointerdown', clickElem.nativeElement, elementRect.left, elementRect.top);
6091+
blurElem.nativeElement.blur();
6092+
blurElem.nativeElement.dispatchEvent(new FocusEvent('focusout', {bubbles: true}));
6093+
(clickElem as DebugElement).nativeElement.focus();
6094+
UIInteractions.simulatePointerEvent('pointerup', clickElem.nativeElement, elementRect.left, elementRect.top);
6095+
UIInteractions.simulateMouseEvent('click', clickElem.nativeElement, 10 , 10);
6096+
}

0 commit comments

Comments
 (0)