Skip to content

Commit a91e252

Browse files
MKirovaMKirova
authored andcommitted
Merge branch 'mkirova/fix-4990-8.2.x' of https://github.com/IgniteUI/igniteui-angular.git
2 parents ba6d738 + 25f2fce commit a91e252

File tree

14 files changed

+163
-30
lines changed

14 files changed

+163
-30
lines changed

projects/igniteui-angular/src/lib/core/grid-selection.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { Injectable, EventEmitter, NgZone } from '@angular/core';
2-
import { IGridEditEventArgs } from '../grids/grid-base.component';
2+
import { IGridEditEventArgs, IgxGridBaseComponent } from '../grids/grid-base.component';
3+
import { FilteringExpressionsTree } from '../data-operations/filtering-expressions-tree';
34

45
export interface GridSelectionRange {
56
rowStart: number;
@@ -688,7 +689,9 @@ export class IgxGridSelectionService {
688689
}
689690

690691
private isFilteringApplied(): boolean {
691-
return this.grid.filteringExpressionsTree.filteringOperands.length > 0;
692+
const grid = this.grid as IgxGridBaseComponent;
693+
return !FilteringExpressionsTree.empty(grid.filteringExpressionsTree) ||
694+
!FilteringExpressionsTree.empty(grid.advancedFilteringExpressionsTree);
692695
}
693696

694697
private isRowDeleted(rowID): boolean {

projects/igniteui-angular/src/lib/directives/template-outlet/template_outlet.directive.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ export class IgxTemplateOutletDirective implements OnChanges {
3232
@Output()
3333
public onCachedViewLoaded = new EventEmitter<ICachedViewLoadedEventArgs>();
3434

35+
@Output()
36+
public onBeforeViewDetach = new EventEmitter<IViewChangeEventArgs>();
37+
3538
constructor(public _viewContainerRef: ViewContainerRef, private _zone: NgZone, public cdr: ChangeDetectorRef) {
3639
}
3740

@@ -65,6 +68,7 @@ export class IgxTemplateOutletDirective implements OnChanges {
6568
private _recreateView() {
6669
// detach old and create new
6770
if (this._viewRef) {
71+
this.onBeforeViewDetach.emit({ owner: this, view: this._viewRef, context: this.igxTemplateOutletContext });
6872
this._viewContainerRef.detach(this._viewContainerRef.indexOf(this._viewRef));
6973
}
7074
if (this.igxTemplateOutlet) {
@@ -91,9 +95,11 @@ export class IgxTemplateOutletDirective implements OnChanges {
9195
if (view !== this._viewRef) {
9296
if (owner._viewContainerRef.indexOf(view) !== -1) {
9397
// detach in case view it is attached somewhere else at the moment.
98+
this.onBeforeViewDetach.emit({ owner: this, view: this._viewRef, context: this.igxTemplateOutletContext });
9499
owner._viewContainerRef.detach(owner._viewContainerRef.indexOf(view));
95100
}
96101
if (this._viewRef && this._viewContainerRef.indexOf(this._viewRef) !== -1) {
102+
this.onBeforeViewDetach.emit({ owner: this, view: this._viewRef, context: this.igxTemplateOutletContext });
97103
this._viewContainerRef.detach(this._viewContainerRef.indexOf(this._viewRef));
98104
}
99105
this._viewRef = view;
@@ -111,6 +117,7 @@ export class IgxTemplateOutletDirective implements OnChanges {
111117
// if view exists, but template has been changed and there is a view in the cache with the related template
112118
// then detach old view and insert the stored one with the matching template
113119
// after that update its context.
120+
this.onBeforeViewDetach.emit({ owner: this, view: this._viewRef, context: this.igxTemplateOutletContext });
114121
this._viewContainerRef.detach(this._viewContainerRef.indexOf(this._viewRef));
115122
this._viewRef = cachedView;
116123
const oldContext = this._cloneContext(cachedView.context);

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

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2072,7 +2072,7 @@ export abstract class IgxGridBaseComponent extends DisplayDensityBase implements
20722072
* @hidden
20732073
*/
20742074
public get parentRowOutletDirective() {
2075-
return null;
2075+
return this.outletDirective;
20762076
}
20772077

20782078
/**
@@ -6048,6 +6048,20 @@ export abstract class IgxGridBaseComponent extends DisplayDensityBase implements
60486048
return this.cellSelection !== GridSelectionMode.none;
60496049
}
60506050

6051+
/** @hidden */
6052+
public viewDetachHandler(args: ICachedViewLoadedEventArgs) {
6053+
const context = args.view.context;
6054+
if (context['templateID'] === 'dataRow') {
6055+
// some browsers (like FireFox and Edge) do not trigger onBlur when the focused element is detached from DOM
6056+
// hence we need to trigger it manually when cell is detached.
6057+
const row = this.getRowByIndex(context.index);
6058+
const focusedCell = row.cells.find(x => x.focused);
6059+
if (focusedCell) {
6060+
focusedCell.onBlur();
6061+
}
6062+
}
6063+
}
6064+
60516065
/**
60526066
* @hidden
60536067
*/

projects/igniteui-angular/src/lib/grids/grid-navigation.service.ts

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -167,23 +167,34 @@ export class IgxGridNavigationService {
167167
}
168168

169169
public movePreviousEditable(rowIndex: number, currentColumnVisibleIndex: number) {
170-
const prevEditableColumnIndex = this.findNextEditable(MoveDirection.LEFT, currentColumnVisibleIndex - 1);
171-
if (prevEditableColumnIndex === -1 && this.grid.rowEditTabs.length) {
172-
// TODO: make gridAPI visible for internal use and remove cast to any
173-
(this.grid as any).gridAPI.submit_value();
174-
this.grid.rowEditTabs.last.element.nativeElement.focus();
175-
return;
170+
let prevEditableColumnIndex = this.findNextEditable(MoveDirection.LEFT, currentColumnVisibleIndex - 1);
171+
if (prevEditableColumnIndex === -1) {
172+
if (this.grid.rowEditTabs.length) {
173+
// TODO: make gridAPI visible for internal use and remove cast to any
174+
(this.grid as any).gridAPI.submit_value();
175+
this.grid.rowEditTabs.last.element.nativeElement.focus();
176+
return;
177+
} else {
178+
// In case when row edit template is empty select last editable cell
179+
prevEditableColumnIndex = this.grid.lastEditableColumnIndex;
180+
}
181+
176182
}
177183
this.focusEditableTarget(rowIndex, prevEditableColumnIndex);
178184
}
179185

180186
public moveNextEditable(rowIndex: number, currentColumnVisibleIndex: number) {
181-
const nextEditableColumnIndex = this.findNextEditable(MoveDirection.RIGHT, currentColumnVisibleIndex + 1);
182-
if (nextEditableColumnIndex === -1 && this.grid.rowEditTabs.length) {
183-
// TODO: make gridAPI visible for internal use and remove cast to any
184-
(this.grid as any).gridAPI.submit_value();
185-
this.grid.rowEditTabs.first.element.nativeElement.focus();
186-
return;
187+
let nextEditableColumnIndex = this.findNextEditable(MoveDirection.RIGHT, currentColumnVisibleIndex + 1);
188+
if (nextEditableColumnIndex === -1) {
189+
if ( this.grid.rowEditTabs.length) {
190+
// TODO: make gridAPI visible for internal use and remove cast to any
191+
(this.grid as any).gridAPI.submit_value();
192+
this.grid.rowEditTabs.first.element.nativeElement.focus();
193+
return;
194+
} else {
195+
// In case when row edit template is empty select first editable cell
196+
nextEditableColumnIndex = this.grid.firstEditableColumnIndex;
197+
}
187198
}
188199
this.focusEditableTarget(rowIndex, nextEditableColumnIndex);
189200
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1251,14 +1251,15 @@ describe('IgxGrid - Filtering actions #grid', () => {
12511251
fix.detectChanges();
12521252

12531253
const firstMonth = calendar.querySelector('.igx-calendar__month');
1254+
const firstMonthText = (firstMonth as HTMLElement).innerText;
12541255
firstMonth.dispatchEvent(new Event('click'));
12551256
tick();
12561257
fix.detectChanges();
12571258

12581259
calendar = outlet.getElementsByClassName('igx-calendar')[0];
12591260
const month = calendar.querySelector('.igx-calendar-picker__date');
12601261

1261-
expect(month.innerHTML.trim()).toEqual('Jan');
1262+
expect(month.innerHTML.trim()).toEqual(firstMonthText);
12621263
}));
12631264

12641265
it('Should correctly select year from year view datepicker/calendar component', fakeAsync(() => {

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

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ import {
2323
IgxGridWithEditingAndFeaturesComponent,
2424
IgxGridRowEditingWithoutEditableColumnsComponent,
2525
IgxGridCustomOverlayComponent,
26-
IgxGridRowEditingWithFeaturesComponent
26+
IgxGridRowEditingWithFeaturesComponent,
27+
IgxGridEmptyRowEditTemplateComponent
2728
} from '../../test-utils/grid-samples.spec';
2829
import { IgxGridTestComponent } from './grid.component.spec';
2930

@@ -45,7 +46,8 @@ describe('IgxGrid - Row Editing #grid', () => {
4546
IgxGridRowEditingWithoutEditableColumnsComponent,
4647
IgxGridTestComponent,
4748
IgxGridCustomOverlayComponent,
48-
IgxGridRowEditingWithFeaturesComponent
49+
IgxGridRowEditingWithFeaturesComponent,
50+
IgxGridEmptyRowEditTemplateComponent
4951
],
5052
imports: [
5153
NoopAnimationsModule, IgxGridModule]
@@ -1912,7 +1914,7 @@ describe('IgxGrid - Row Editing #grid', () => {
19121914

19131915
expect(parseInt(GridFunctions.getRowEditingBannerText(fix), 10)).toEqual(0);
19141916
fix.componentInstance.cellInEditMode.editValue = 'Spiro';
1915-
fix.componentInstance.moveNext(true);
1917+
UIInteractions.triggerKeyDownWithBlur('tab', cell.nativeElement, true);
19161918
tick(16);
19171919
fix.detectChanges();
19181920

@@ -1923,6 +1925,41 @@ describe('IgxGrid - Row Editing #grid', () => {
19231925
expect(grid.endEdit).toHaveBeenCalled();
19241926
expect(grid.endEdit).toHaveBeenCalledTimes(1);
19251927
}));
1928+
1929+
it('Empty template', fakeAsync(() => {
1930+
const fix = TestBed.createComponent(IgxGridEmptyRowEditTemplateComponent);
1931+
fix.detectChanges();
1932+
tick(16);
1933+
1934+
const grid = fix.componentInstance.grid;
1935+
let cell = grid.getCellByColumn(0, 'ProductName');
1936+
UIInteractions.triggerKeyDownEvtUponElem('f2', cell.nativeElement, true);
1937+
1938+
fix.detectChanges();
1939+
tick(16);
1940+
1941+
cell.editValue = 'Spiro';
1942+
UIInteractions.triggerKeyDownEvtUponElem('tab', cell.nativeElement, true);
1943+
1944+
fix.detectChanges();
1945+
tick(16);
1946+
fix.detectChanges();
1947+
tick(16);
1948+
1949+
expect(cell.editMode).toBe(false);
1950+
cell = grid.getCellByColumn(0, 'ReorderLevel');
1951+
expect(cell.editMode).toBe(true);
1952+
1953+
UIInteractions.triggerKeyDownEvtUponElem('tab', cell.nativeElement, true, false, true);
1954+
fix.detectChanges();
1955+
tick(16);
1956+
fix.detectChanges();
1957+
tick(16);
1958+
1959+
expect(cell.editMode).toBe(false);
1960+
cell = grid.getCellByColumn(0, 'ProductName');
1961+
expect(cell.editMode).toBe(true);
1962+
}));
19261963
});
19271964

19281965
describe('Transaction', () => {

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

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ import { GridFunctions, GridSelectionFunctions } from '../../test-utils/grid-fun
1919
import { SampleTestData } from '../../test-utils/sample-test-data.spec';
2020
import { GridSelectionMode } from '../common/enums';
2121
import { IgxRowSelectorsModule } from '../igx-row-selectors.module';
22+
import { FilteringExpressionsTree } from '../../data-operations/filtering-expressions-tree';
23+
import { FilteringLogic } from '../../data-operations/filtering-expression.interface';
2224

2325
const DEBOUNCETIME = 30;
2426

@@ -1671,6 +1673,38 @@ describe('IgxGrid - Row Selection #grid', () => {
16711673
expect(grid.getRowByIndex(1).selected).toBeTruthy();
16721674
expect(grid.onRowSelectionChange.emit).toHaveBeenCalledTimes(6);
16731675
}));
1676+
1677+
it('Should select only filtered records', fakeAsync(() => {
1678+
grid.height = '1100px';
1679+
const tree = new FilteringExpressionsTree(FilteringLogic.And);
1680+
tree.filteringOperands.push({
1681+
fieldName: 'UnitsInStock',
1682+
searchVal: 0,
1683+
condition: IgxNumberFilteringOperand.instance().condition('greaterThan'),
1684+
});
1685+
tree.filteringOperands.push({
1686+
fieldName: 'ProductName',
1687+
searchVal: 'a',
1688+
condition: IgxStringFilteringOperand.instance().condition('contains'),
1689+
ignoreCase: true
1690+
});
1691+
grid.advancedFilteringExpressionsTree = tree;
1692+
GridSelectionFunctions.headerCheckboxClick(grid);
1693+
fix.detectChanges();
1694+
tick();
1695+
1696+
expect(grid.rowList.length).toBe(9);
1697+
expect(grid.selectedRows().length).toBe(9);
1698+
GridSelectionFunctions.verifyHeaderRowCheckboxState(grid, true, false);
1699+
1700+
grid.advancedFilteringExpressionsTree = null;
1701+
fix.detectChanges();
1702+
tick();
1703+
1704+
expect(grid.rowList.length).toBe(19);
1705+
expect(grid.selectedRows().length).toBe(9);
1706+
GridSelectionFunctions.verifyHeaderRowCheckboxState(grid, false, true);
1707+
}));
16741708
});
16751709

16761710
describe('Integration with CRUD and transactions', () => {

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,8 @@
131131
<ng-template
132132
[igxTemplateOutlet]='isGroupByRecord(rowData) ? group_template : isSummaryRow(rowData) ? summary_template : record_template'
133133
[igxTemplateOutletContext]='getContext(rowData, rowIndex)'
134-
(onCachedViewLoaded)='cachedViewLoaded($event)'>
134+
(onCachedViewLoaded)='cachedViewLoaded($event)'
135+
(onBeforeViewDetach)='viewDetachHandler($event)' >
135136
</ng-template>
136137
</ng-template>
137138
<ng-container *ngTemplateOutlet="template"></ng-container>

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2565,6 +2565,7 @@ describe('IgxGrid - GroupBy #grid', () => {
25652565
it('should apply custom comparer function when grouping by dragging a column into the group area', async () => {
25662566
const fix = TestBed.createComponent(GroupableGridComponent);
25672567
const grid = fix.componentInstance.instance;
2568+
const year = new Date().getFullYear().toString();
25682569
fix.detectChanges();
25692570
await wait();
25702571

@@ -2604,7 +2605,7 @@ describe('IgxGrid - GroupBy #grid', () => {
26042605
expect(grid.groupsRecords.length).toEqual(2);
26052606
expect(grid.groupsRecords[1].records.length).toEqual(6);
26062607
for (let i = 0; i < grid.groupsRecords[1].records.length; i++) {
2607-
expect(grid.groupsRecords[1].records[i].ReleaseDate.getFullYear().toString()).toEqual('2019');
2608+
expect(grid.groupsRecords[1].records[i].ReleaseDate.getFullYear().toString()).toEqual(year);
26082609
}
26092610
});
26102611

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@
9393
<ng-template
9494
[igxTemplateOutlet]='(isHierarchicalRecord(rowData) ? hierarchical_record_template : (isChildGridRecord(rowData) && isExpanded(rowData) ? child_record_template : hierarchical_record_template))'
9595
[igxTemplateOutletContext]='getContext(rowData)' (onViewCreated)='viewCreatedHandler($event)'
96-
(onViewMoved)='viewMovedHandler($event)' (onCachedViewLoaded)='cachedViewLoaded($event)'></ng-template>
96+
(onViewMoved)='viewMovedHandler($event)' (onCachedViewLoaded)='cachedViewLoaded($event)' (onBeforeViewDetach)='viewDetachHandler($event)'></ng-template>
9797
<!-- <ng-container *igxTemplateOutlet="(isHierarchicalRecord(rowData) ? hierarchical_record_template : (isChildGridRecord(rowData) && isExpanded(rowData) ? child_record_template : hierarchical_record_template)); context: getContext(rowData)"></ng-container> -->
9898
</ng-template>
9999
<ng-template #hierarchical_record_template let-rowIndex="index" let-rowData>

0 commit comments

Comments
 (0)