Skip to content

Commit 533b4b3

Browse files
Merge branch '10.2.x' into ibarakov/fix-8184-10.2.x
2 parents d703d3b + 3f07c85 commit 533b4b3

File tree

9 files changed

+107
-26
lines changed

9 files changed

+107
-26
lines changed

projects/igniteui-angular/src/lib/grids/cell.component.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -795,6 +795,7 @@ export class IgxGridCellComponent implements OnInit, OnChanges, OnDestroy {
795795
const dragMode = this.selectionService.pointerEnter(this.selectionNode, event);
796796
if (dragMode) {
797797
this.grid.cdr.detectChanges();
798+
if (isIE()) { this.grid.tbody.nativeElement.focus({ preventScroll: true }); }
798799
}
799800
}
800801

@@ -808,6 +809,7 @@ export class IgxGridCellComponent implements OnInit, OnChanges, OnDestroy {
808809
this.grid.navigation.activeNode.gridID !== this.gridID))) { return; }
809810
if (this.selectionService.pointerUp(this.selectionNode, this.grid.onRangeSelection)) {
810811
this.grid.cdr.detectChanges();
812+
if (isIE()) { this.grid.tbody.nativeElement.focus({ preventScroll: true }); }
811813
}
812814
}
813815

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

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -175,11 +175,6 @@ export abstract class IgxGridBaseDirective extends DisplayDensityBase implements
175175
private _cdrRequests = false;
176176
protected _cdrRequestRepaint = false;
177177

178-
/**
179-
* @hidden @internal
180-
*/
181-
public snackbarDisplayTime = 2000;
182-
183178
/**
184179
* @hidden @internal
185180
*/
@@ -250,6 +245,14 @@ export abstract class IgxGridBaseDirective extends DisplayDensityBase implements
250245
return this._resourceStrings;
251246
}
252247

248+
/**
249+
* Gets/Sets the display time for the row adding snackbar notification.
250+
* @remarks
251+
* By default it is 6000ms.
252+
*/
253+
@Input()
254+
public snackbarDisplayTime = 6000;
255+
253256
/**
254257
* Gets/Sets whether to autogenerate the columns.
255258
* @remarks
@@ -2984,6 +2987,7 @@ export abstract class IgxGridBaseDirective extends DisplayDensityBase implements
29842987
_setupListeners() {
29852988
const destructor = takeUntil<any>(this.destroy$);
29862989
fromEvent(this.nativeElement, 'focusout').pipe(filter(() => !!this.navigation.activeNode), destructor).subscribe((event) => {
2990+
if (this.selectionService.dragMode && isIE()) { return; }
29872991
if (!this.crudService.cell &&
29882992
!!this.navigation.activeNode &&
29892993
((event.target === this.tbody.nativeElement && this.navigation.activeNode.row >= 0 &&
@@ -5159,6 +5163,7 @@ export abstract class IgxGridBaseDirective extends DisplayDensityBase implements
51595163
*/
51605164
protected onColumnsChanged(change: QueryList<IgxColumnComponent>) {
51615165
const diff = this.columnListDiffer.diff(change);
5166+
51625167
if (this.autoGenerate && this.columnList.length === 0 && this._autoGeneratedCols.length > 0) {
51635168
// In Ivy if there are nested conditional templates the content children are re-evaluated
51645169
// hence autogenerated columns are cleared and need to be reset.
@@ -5168,15 +5173,14 @@ export abstract class IgxGridBaseDirective extends DisplayDensityBase implements
51685173
if (diff) {
51695174
let added = false;
51705175
let removed = false;
5171-
5172-
this.initColumns(this.columnList);
5173-
5174-
51755176
diff.forEachAddedItem((record: IterableChangeRecord<IgxColumnComponent>) => {
51765177
this.onColumnInit.emit(record.item);
51775178
added = true;
5179+
record.item.pinned ? this._pinnedColumns.push(record.item) : this._unpinnedColumns.push(record.item);
51785180
});
51795181

5182+
this.initColumns(this.columnList);
5183+
51805184
diff.forEachRemovedItem((record: IterableChangeRecord<IgxColumnComponent | IgxColumnGroupComponent>) => {
51815185
const isColumnGroup = record.item instanceof IgxColumnGroupComponent;
51825186
if (!isColumnGroup) {
@@ -5902,21 +5906,12 @@ export abstract class IgxGridBaseDirective extends DisplayDensityBase implements
59025906
}
59035907
}
59045908

5905-
/**
5906-
* @hidden @internal
5907-
*/
5908-
copyHandlerIE() {
5909-
if (isIE()) {
5910-
this.copyHandler(null, true);
5911-
}
5912-
}
5913-
59145909
/**
59155910
* @hidden
59165911
* @internal
59175912
*/
5918-
public copyHandler(event, ie11 = false) {
5919-
if (!this.clipboardOptions.enabled || this.crudService.cellInEditMode) {
5913+
public copyHandler(event) {
5914+
if (!this.clipboardOptions.enabled || this.crudService.cellInEditMode || (!isIE() && event.type === 'keydown')) {
59205915
return;
59215916
}
59225917

@@ -5935,7 +5930,7 @@ export abstract class IgxGridBaseDirective extends DisplayDensityBase implements
59355930
result = result.substring(result.indexOf('\n') + 1);
59365931
}
59375932

5938-
if (ie11) {
5933+
if (isIE()) {
59395934
(window as any).clipboardData.setData('Text', result);
59405935
return;
59415936
}

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,13 @@ export class IgxGridNavigationService {
8888
event.preventDefault();
8989
key === 'pagedown' ? this.grid.verticalScrollContainer.scrollNextPage() :
9090
this.grid.verticalScrollContainer.scrollPrevPage();
91+
const editCell = this.grid.crudService.cell;
92+
this.grid.verticalScrollContainer.onChunkLoad
93+
.pipe(first()).subscribe(() => {
94+
if (editCell && this.grid.rowList.map(r => r.index).indexOf(editCell.rowIndex) < 0) {
95+
this.grid.tbody.nativeElement.focus({preventScroll: true});
96+
}
97+
});
9198
break;
9299
case 'tab':
93100
this.handleEditing(shift, event);

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

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { IgxGridComponent } from './grid.component';
55
import { IgxGridModule } from './public_api';
66
import { GridTemplateStrings, ColumnDefinitions } from '../../test-utils/template-strings.spec';
77
import { SampleTestData } from '../../test-utils/sample-test-data.spec';
8-
import { ColumnHiddenFromMarkupComponent, ColumnCellFormatterComponent, DynamicColumnsComponent } from '../../test-utils/grid-samples.spec';
8+
import { ColumnHiddenFromMarkupComponent, ColumnCellFormatterComponent, DynamicColumnsComponent, GridAddColumnComponent } from '../../test-utils/grid-samples.spec';
99
import { configureTestSuite } from '../../test-utils/configure-suite';
1010
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
1111
import { IgxStringFilteringOperand } from '../../data-operations/filtering-condition';
@@ -27,7 +27,8 @@ describe('IgxGrid - Column properties #grid', () => {
2727
ColumnCellFormatterComponent,
2828
ColumnHaederClassesComponent,
2929
ColumnHiddenFromMarkupComponent,
30-
DynamicColumnsComponent
30+
DynamicColumnsComponent,
31+
GridAddColumnComponent
3132
],
3233
imports: [IgxGridModule, NoopAnimationsModule]
3334
})
@@ -167,6 +168,34 @@ describe('IgxGrid - Column properties #grid', () => {
167168
expect(grid.columnList.last.field).toMatch('Name');
168169
}));
169170

171+
it('should add new column at the correct visible index', fakeAsync(() => {
172+
const fix = TestBed.createComponent(GridAddColumnComponent);
173+
fix.detectChanges();
174+
const grid = fix.componentInstance.grid;
175+
const maxVindex = fix.componentInstance.columns.length - 1;
176+
177+
// add to unpinned area
178+
fix.componentInstance.columns.push({ field: 'City', width: 150, movable: true, type: 'string' });
179+
fix.detectChanges();
180+
181+
let cityCol = grid.getColumnByName('City');
182+
expect(cityCol.visibleIndex).toEqual(maxVindex + 1);
183+
184+
// remove the newly added column
185+
fix.componentInstance.columns.pop();
186+
fix.detectChanges();
187+
188+
cityCol = grid.getColumnByName('City');
189+
expect(cityCol).not.toBeDefined();
190+
191+
// add to pinned area
192+
fix.componentInstance.columns.push({ field: 'City', width: 150, movable: true, type: 'string', pinned: true });
193+
fix.detectChanges();
194+
195+
cityCol = grid.getColumnByName('City');
196+
expect(cityCol.visibleIndex).toEqual( 1);
197+
}));
198+
170199
it('should apply columnWidth on columns that don\'t have explicit width', () => {
171200
const fix = TestBed.createComponent(ColumnCellFormatterComponent);
172201
fix.componentInstance.grid.columnWidth = '200px';

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,27 @@ describe('IgxGrid - Row Adding #grid', () => {
288288
const cell = newRow.cells.find(c => c.column === column);
289289
expect(typeof(cell.value)).toBe(type);
290290
});
291+
292+
it('should allow setting a different display time for snackbar', async() => {
293+
grid.snackbarDisplayTime = 50;
294+
fixture.detectChanges();
295+
296+
const row = grid.getRowByIndex(0);
297+
row.beginAddRow();
298+
fixture.detectChanges();
299+
300+
endTransition();
301+
302+
grid.endEdit(true);
303+
fixture.detectChanges();
304+
305+
expect(grid.addRowSnackbar.isVisible).toBe(true);
306+
// should hide after 50ms
307+
await wait(51);
308+
fixture.detectChanges();
309+
310+
expect(grid.addRowSnackbar.isVisible).toBe(false);
311+
});
291312
});
292313

293314
describe('Add row events tests:', () => {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@
9898
<div class="igx-grid__thead-thumb" [hidden]='!hasVerticalScroll()' [style.width.px]="scrollSize"></div>
9999
</div>
100100

101-
<div igxGridBody (keydown.control.c)="copyHandlerIE()" (copy)="copyHandler($event)" class="igx-grid__tbody">
101+
<div igxGridBody (keydown.control.c)="copyHandler($event)" (copy)="copyHandler($event)" class="igx-grid__tbody">
102102
<div class="igx-grid__tbody-content" tabindex="0" [attr.aria-activedescendant]="activeDescendant" (keydown)="navigation.handleNavigation($event)" (focus)="navigation.focusTbody($event)"
103103
role="rowgroup" (onDragStop)="selectionService.dragMode = $event" (scroll)='preventContainerScroll($event)'
104104
(onDragScroll)="dragScroll($event)" [igxGridDragSelect]="selectionService.dragMode"

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
@@ -82,7 +82,7 @@
8282
<div class="igx-grid__thead-thumb" [hidden]='!hasVerticalScroll()' [style.width.px]="scrollSize"></div>
8383
</div>
8484

85-
<div igxGridBody (keydown.control.c)="copyHandlerIE()" (copy)="copyHandler($event)" class="igx-grid__tbody">
85+
<div igxGridBody (keydown.control.c)="copyHandler($event)" (copy)="copyHandler($event)" class="igx-grid__tbody">
8686
<div class="igx-grid__tbody-content" tabindex="0" (focus)="navigation.focusTbody($event)" [attr.aria-activedescendant]="activeDescendant"
8787
(keydown)="navigation.handleNavigation($event)" (onDragStop)="selectionService.dragMode = $event"
8888
(onDragScroll)="dragScroll($event)" [igxGridDragSelect]="selectionService.dragMode" role="rowgroup"

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@
6464
id="right" class="igx-grid__scroll-on-drag-right"></span>
6565
</div>
6666

67-
<div igxGridBody (keydown.control.c)="copyHandlerIE()" (copy)="copyHandler($event)" class="igx-grid__tbody">
67+
<div igxGridBody (keydown.control.c)="copyHandler($event)" (copy)="copyHandler($event)" class="igx-grid__tbody">
6868
<div class="igx-grid__tbody-content" tabindex="0" (focus)="navigation.focusTbody($event)" [attr.aria-activedescendant]="activeDescendant" (keydown)="navigation.handleNavigation($event)" role="rowgroup" (onDragStop)="selectionService.dragMode = $event"
6969
(onDragScroll)="dragScroll($event)" [igxGridDragSelect]="selectionService.dragMode"
7070
[style.height.px]='totalHeight' [style.width.px]='calcWidth' #tbody (scroll)='preventContainerScroll($event)'>

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

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,33 @@ export class ColumnHiddenFromMarkupComponent extends BasicGridComponent {
122122
data = SampleTestData.personIDNameData();
123123
}
124124

125+
@Component({
126+
template: `
127+
<igx-grid #grid1 [data]="data" [columnPinning]='true' [width]="'900px'" [height]="'600px'">
128+
<igx-column *ngFor="let c of columns" [field]="c.field"
129+
[header]="c.field"
130+
[movable]="c.movable"
131+
[width]="c.width"
132+
[editable]="true"
133+
[pinned]="c.pinned"
134+
[dataType]="c.type">
135+
</igx-column>
136+
</igx-grid>
137+
`
138+
})
139+
export class GridAddColumnComponent extends BasicGridComponent implements OnInit {
140+
public columns: Array<any>;
141+
data = SampleTestData.contactInfoDataFull();
142+
public ngOnInit(): void {
143+
this.columns = [
144+
{ field: 'ID', width: 150, movable: true, type: 'string', pinned: true },
145+
{ field: 'CompanyName', width: 150, movable: true, type: 'string'},
146+
{ field: 'ContactName', width: 150, movable: true, type: 'string' },
147+
{ field: 'ContactTitle', width: 150, movable: true, type: 'string' },
148+
{ field: 'Address', width: 150, movable: true, type: 'string' }];
149+
}
150+
}
151+
125152
@Component({
126153
template: GridTemplateStrings.declareGrid('', '',
127154
ColumnDefinitions.idNameFormatter)

0 commit comments

Comments
 (0)