igniteui-angular-sovn
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
1,191 lines (889 loc) • 56 kB
text/typescript
import { TestBed, fakeAsync, tick } from '@angular/core/testing';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import { IgxGridComponent } from './grid.component';
import { UIInteractions, wait } from '../../test-utils/ui-interactions.spec';
import { clearGridSubs, setupGridScrollDetection } from '../../test-utils/helper-utils.spec';
import { configureTestSuite } from '../../test-utils/configure-suite';
import {
SelectionWithScrollsComponent,
MRLTestComponent,
ColumnGroupsNavigationTestComponent
} from '../../test-utils/grid-samples.spec';
import { GridFunctions, GridSelectionFunctions } from '../../test-utils/grid-functions.spec';
import { GridSelectionMode, FilterMode } from '../common/enums';
import { IActiveNodeChangeEventArgs } from '../common/events';
import { IgxStringFilteringOperand } from '../../data-operations/filtering-condition';
import { IgxGridHeaderRowComponent } from '../headers/grid-header-row.component';
import { ISortingStrategy, SortingDirection } from '../../data-operations/sorting-strategy';
const DEBOUNCETIME = 30;
describe('IgxGrid - Headers Keyboard navigation #grid', () => {
describe('Headers Navigation', () => {
let fix;
let grid: IgxGridComponent;
let gridHeader: IgxGridHeaderRowComponent;
configureTestSuite((() => {
return TestBed.configureTestingModule({
imports: [SelectionWithScrollsComponent, NoopAnimationsModule]
});
}));
beforeEach(() => {
fix = TestBed.createComponent(SelectionWithScrollsComponent);
fix.detectChanges();
grid = fix.componentInstance.grid;
setupGridScrollDetection(fix, grid);
fix.detectChanges();
gridHeader = GridFunctions.getGridHeader(grid);
});
afterEach(() => {
clearGridSubs();
});
it('when click on a header it should stay in the view', async () => {
grid.headerContainer.getScroll().scrollLeft = 1000;
await wait(100);
fix.detectChanges();
let header = GridFunctions.getColumnHeader('OnPTO', fix);
UIInteractions.simulateClickAndSelectEvent(header);
await wait(200);
fix.detectChanges();
header = GridFunctions.getColumnHeader('OnPTO', fix);
expect(header).toBeDefined();
GridFunctions.verifyHeaderIsFocused(header.parent);
});
it('should focus first header when the grid is scrolled', async () => {
grid.navigateTo(7, 5);
await wait(250);
fix.detectChanges();
gridHeader.nativeElement.focus(); //('focus', {});
await wait(250);
fix.detectChanges();
const header = GridFunctions.getColumnHeader('ID', fix);
expect(header).not.toBeDefined();
expect(grid.navigation.activeNode.column).toEqual(3);
expect(grid.navigation.activeNode.row).toEqual(-1);
expect(grid.headerContainer.getScroll().scrollLeft).toBeGreaterThanOrEqual(200);
expect(grid.verticalScrollContainer.getScroll().scrollTop).toBeGreaterThanOrEqual(100);
});
it('should emit when activeNode ref is changed', () => {
spyOn(grid.activeNodeChange, 'emit').and.callThrough();
const args: IActiveNodeChangeEventArgs = {
row: -1,
column: 0,
level: 0,
tag: 'headerCell'
};
gridHeader.nativeElement.focus(); //('focus', null);
fix.detectChanges();
expect(grid.activeNodeChange.emit).toHaveBeenCalledWith(args);
UIInteractions.triggerEventHandlerKeyDown('ArrowRight', gridHeader);
fix.detectChanges();
args.column += 1;
expect(grid.activeNodeChange.emit).toHaveBeenCalledWith(args);
UIInteractions.triggerEventHandlerKeyDown('ArrowLeft', gridHeader);
fix.detectChanges();
args.column -= 1;
expect(grid.activeNodeChange.emit).toHaveBeenCalledWith(args);
expect(grid.activeNodeChange.emit).toHaveBeenCalledTimes(3);
});
it('should allow horizontal navigation', async () => {
// Focus grid header
gridHeader.nativeElement.focus(); //('focus', null);
fix.detectChanges();
// Verify first header is focused
let header = GridFunctions.getColumnHeader('ID', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
for (let index = 0; index < 5; index++) {
UIInteractions.triggerEventHandlerKeyDown('ArrowRight', gridHeader);
await wait(DEBOUNCETIME);
fix.detectChanges();
}
header = GridFunctions.getColumnHeader('OnPTO', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
// Press arrow right again
UIInteractions.triggerEventHandlerKeyDown('ArrowRight', gridHeader);
fix.detectChanges();
GridFunctions.verifyHeaderIsFocused(header.parent);
for (let index = 5; index > 1; index--) {
UIInteractions.triggerEventHandlerKeyDown('ArrowLeft', gridHeader);
await wait(DEBOUNCETIME);
fix.detectChanges();
}
header = GridFunctions.getColumnHeader('ParentID', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
});
it('should navigate to first/last header', async () => {
// Focus grid header
let header = GridFunctions.getColumnHeader('ParentID', fix);
UIInteractions.simulateClickAndSelectEvent(header);
fix.detectChanges();
// Verify header is focused
GridFunctions.verifyHeaderIsFocused(header.parent);
// Press end key
UIInteractions.triggerEventHandlerKeyDown('End', gridHeader);
await wait(100);
fix.detectChanges();
header = GridFunctions.getColumnHeader('OnPTO', fix);
expect(header).toBeTruthy();
expect(grid.navigation.activeNode.column).toEqual(5);
expect(grid.navigation.activeNode.row).toEqual(-1);
// Press Home ket
UIInteractions.triggerEventHandlerKeyDown('home', gridHeader);
await wait(100);
fix.detectChanges();
header = GridFunctions.getColumnHeader('ID', fix);
expect(header).toBeTruthy();
expect(grid.navigation.activeNode.column).toEqual(0);
expect(grid.navigation.activeNode.row).toEqual(-1);
// Press Ctrl+ Arrow right
UIInteractions.triggerEventHandlerKeyDown('ArrowRight', gridHeader, false, false, true);
await wait(100);
fix.detectChanges();
header = GridFunctions.getColumnHeader('OnPTO', fix);
expect(header).toBeTruthy();
expect(grid.navigation.activeNode.column).toEqual(5);
expect(grid.navigation.activeNode.row).toEqual(-1);
// Press Ctrl+ Arrow left
UIInteractions.triggerEventHandlerKeyDown('ArrowLeft', gridHeader, false, false, true);
await wait(DEBOUNCETIME);
fix.detectChanges();
header = GridFunctions.getColumnHeader('ID', fix);
expect(header).toBeTruthy();
expect(grid.navigation.activeNode.column).toEqual(0);
expect(grid.navigation.activeNode.row).toEqual(-1);
});
it('should not change active header on arrow up or down pressed', () => {
// Focus grid header
const header = GridFunctions.getColumnHeader('Name', fix);
UIInteractions.simulateClickAndSelectEvent(header);
fix.detectChanges();
// Verify header is focused
GridFunctions.verifyHeaderIsFocused(header.parent);
// Press arrow down key
UIInteractions.triggerEventHandlerKeyDown('ArrowDown', gridHeader);
fix.detectChanges();
GridFunctions.verifyHeaderIsFocused(header.parent);
// Press arrow up key
UIInteractions.triggerEventHandlerKeyDown('ArrowUp', gridHeader, false, false, true);
fix.detectChanges();
GridFunctions.verifyHeaderIsFocused(header.parent);
// Press pageUp key
UIInteractions.triggerEventHandlerKeyDown('PageUp', gridHeader);
fix.detectChanges();
GridFunctions.verifyHeaderIsFocused(header.parent);
// Press pageDown key
UIInteractions.triggerEventHandlerKeyDown('PageUp', gridHeader);
fix.detectChanges();
GridFunctions.verifyHeaderIsFocused(header.parent);
});
it('Verify navigation when there are pinned columns', async () => {
grid.getColumnByName('ParentID').pinned = true;
fix.detectChanges();
// Focus grid header
gridHeader.nativeElement.focus(); //('focus', null);
fix.detectChanges();
// Verify first header is focused
let header = GridFunctions.getColumnHeader('ParentID', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
// Navigate to last cell
UIInteractions.triggerEventHandlerKeyDown('End', gridHeader);
await wait(DEBOUNCETIME);
fix.detectChanges();
header = GridFunctions.getColumnHeader('OnPTO', fix);
expect(header).toBeTruthy();
expect(grid.navigation.activeNode.column).toEqual(5);
expect(grid.navigation.activeNode.row).toEqual(-1);
// Click on the pinned column
header = GridFunctions.getColumnHeader('ParentID', fix);
UIInteractions.simulateClickAndSelectEvent(header);
fix.detectChanges();
// Start navigating right
for (let index = 0; index < 5; index++) {
UIInteractions.triggerEventHandlerKeyDown('ArrowRight', gridHeader);
await wait(DEBOUNCETIME);
fix.detectChanges();
}
header = GridFunctions.getColumnHeader('OnPTO', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
const hScroll = grid.headerContainer.getScroll().scrollLeft;
// Navigate with home key
UIInteractions.triggerEventHandlerKeyDown('Home', gridHeader);
await wait(DEBOUNCETIME);
fix.detectChanges();
header = GridFunctions.getColumnHeader('ParentID', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
expect(grid.headerContainer.getScroll().scrollLeft).toEqual(hScroll);
});
it('Sorting: Should be able to sort a column with the keyboard', fakeAsync (() => {
spyOn(grid.sorting, 'emit').and.callThrough();
spyOn(grid.sortingDone, 'emit').and.callThrough();
grid.getColumnByName('ID').sortable = true;
fix.detectChanges();
// Focus grid header
let header = GridFunctions.getColumnHeader('ID', fix);
UIInteractions.simulateClickAndSelectEvent(header);
fix.detectChanges();
// Verify first header is focused
GridFunctions.verifyHeaderIsFocused(header.parent);
UIInteractions.triggerEventHandlerKeyDown('ArrowUp', gridHeader, false, false, true);
tick(DEBOUNCETIME);
fix.detectChanges();
GridFunctions.verifyHeaderSortIndicator(header, true);
expect(grid.sortingExpressions.length).toEqual(1);
expect(grid.sortingExpressions[0].fieldName).toEqual('ID');
expect(grid.sortingExpressions[0].dir).toEqual(SortingDirection.Asc);
expect(grid.sorting.emit).toHaveBeenCalledWith({
cancel: false,
sortingExpressions: grid.sortingExpressions,
owner: grid
});
GridFunctions.verifyHeaderIsFocused(header.parent);
UIInteractions.triggerEventHandlerKeyDown('ArrowUp', gridHeader, false, false, true);
tick(DEBOUNCETIME);
fix.detectChanges();
GridFunctions.verifyHeaderSortIndicator(header, false, false);
expect(grid.sortingExpressions.length).toEqual(0);
GridFunctions.verifyHeaderIsFocused(header.parent);
UIInteractions.triggerEventHandlerKeyDown('ArrowUp', gridHeader, false, false, true);
tick(DEBOUNCETIME);
fix.detectChanges();
GridFunctions.verifyHeaderSortIndicator(header, true);
expect(grid.sortingExpressions.length).toEqual(1);
expect(grid.sortingExpressions[0].fieldName).toEqual('ID');
expect(grid.sortingExpressions[0].dir).toEqual(SortingDirection.Asc);
UIInteractions.triggerEventHandlerKeyDown('ArrowDown', gridHeader, false, false, true);
tick(DEBOUNCETIME);
fix.detectChanges();
GridFunctions.verifyHeaderSortIndicator(header, false, true);
expect(grid.sortingExpressions.length).toEqual(1);
expect(grid.sortingExpressions[0].fieldName).toEqual('ID');
expect(grid.sortingExpressions[0].dir).toEqual(SortingDirection.Desc);
UIInteractions.triggerEventHandlerKeyDown('ArrowDown', gridHeader, false, false, true);
tick(DEBOUNCETIME);
fix.detectChanges();
GridFunctions.verifyHeaderSortIndicator(header, false, false);
expect(grid.sortingExpressions.length).toEqual(0);
// select not sortable column
UIInteractions.triggerEventHandlerKeyDown('ArrowRight', gridHeader);
fix.detectChanges();
header = GridFunctions.getColumnHeader('ParentID', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
UIInteractions.triggerEventHandlerKeyDown('ArrowDown', gridHeader, false, false, true);
tick(DEBOUNCETIME);
fix.detectChanges();
GridFunctions.verifyHeaderSortIndicator(header, false, false, false);
expect(grid.sortingExpressions.length).toEqual(0);
UIInteractions.triggerEventHandlerKeyDown('ArrowUp', gridHeader, false, false, true);
tick(DEBOUNCETIME);
fix.detectChanges();
GridFunctions.verifyHeaderSortIndicator(header, false, false, false);
expect(grid.sortingExpressions.length).toEqual(0);
expect(grid.sorting.emit).toHaveBeenCalledTimes(5);
expect(grid.sortingDone.emit).toHaveBeenCalledTimes(5);
}));
it('Filtering: Should be able to open filter row with the keyboard', () => {
// Focus grid header
let header = GridFunctions.getColumnHeader('ID', fix);
UIInteractions.simulateClickAndSelectEvent(header);
fix.detectChanges();
// Verify first header is focused
GridFunctions.verifyHeaderIsFocused(header.parent);
// Test when grid does not have filtering
UIInteractions.triggerEventHandlerKeyDown('L', gridHeader, false, true, true);
fix.detectChanges();
let filterRow = GridFunctions.getFilterRow(fix);
expect(filterRow).toBeNull();
// Allow filtering
grid.allowFiltering = true;
grid.getColumnByName('ID').filterable = false;
fix.detectChanges();
// Try to open filter row for not filterable column
UIInteractions.triggerEventHandlerKeyDown('L', gridHeader, false, true, true);
fix.detectChanges();
filterRow = GridFunctions.getFilterRow(fix);
expect(filterRow).toBeNull();
UIInteractions.triggerEventHandlerKeyDown('ArrowRight', gridHeader);
fix.detectChanges();
header = GridFunctions.getColumnHeader('ParentID', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
// Try to open filter row for not filterable column
UIInteractions.triggerEventHandlerKeyDown('L', gridHeader, false, true, true);
fix.detectChanges();
filterRow = GridFunctions.getFilterRow(fix);
expect(filterRow).not.toBeNull();
expect(grid.filteringRow.column.field).toEqual('ParentID');
});
it('Excel Style Filtering: Should be able to open ESF with the keyboard', () => {
// Allow ESF
grid.allowFiltering = true;
grid.filterMode = FilterMode.excelStyleFilter;
grid.getColumnByName('ID').filterable = false;
fix.detectChanges();
let header = GridFunctions.getColumnHeader('ID', fix);
UIInteractions.simulateClickAndSelectEvent(header);
fix.detectChanges();
// Try to open filter for not filterable column
UIInteractions.triggerEventHandlerKeyDown('L', gridHeader, false, true, true);
fix.detectChanges();
let filterDialog = GridFunctions.getExcelStyleFilteringComponent(fix);
expect(filterDialog).toBeNull();
UIInteractions.triggerEventHandlerKeyDown('ArrowRight', gridHeader);
fix.detectChanges();
header = GridFunctions.getColumnHeader('ParentID', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
// Open filter
UIInteractions.triggerEventHandlerKeyDown('L', gridHeader, false, true, true);
fix.detectChanges();
filterDialog = GridFunctions.getExcelStyleFilteringComponent(fix);
expect(filterDialog).toBeDefined();
});
it('Advanced Filtering: Should be able to open Advanced filter', () => {
const header = GridFunctions.getColumnHeader('ID', fix);
UIInteractions.simulateClickAndSelectEvent(header);
fix.detectChanges();
// Verify first header is focused
GridFunctions.verifyHeaderIsFocused(header.parent);
// Test when advanced filtering is disabled
UIInteractions.triggerEventHandlerKeyDown('L', gridHeader, true);
fix.detectChanges();
// Verify AF dialog is not opened.
expect(GridFunctions.getAdvancedFilteringComponent(fix)).toBeNull();
// Enable Advanced Filtering
grid.allowAdvancedFiltering = true;
fix.detectChanges();
UIInteractions.triggerEventHandlerKeyDown('L', gridHeader, true);
fix.detectChanges();
// Verify AF dialog is opened.
expect(GridFunctions.getAdvancedFilteringComponent(fix)).not.toBeNull();
});
it('Advanced Filtering: Should be able to close Advanced filtering with "escape"', fakeAsync(() => {
// Enable Advanced Filtering
grid.allowAdvancedFiltering = true;
fix.detectChanges();
let header = GridFunctions.getColumnHeader('Name', fix);
UIInteractions.simulateClickAndSelectEvent(header);
fix.detectChanges();
// Verify first header is focused
GridFunctions.verifyHeaderIsFocused(header.parent);
UIInteractions.triggerEventHandlerKeyDown('L', gridHeader, true);
fix.detectChanges();
// Verify AF dialog is opened.
expect(GridFunctions.getAdvancedFilteringComponent(fix)).not.toBeNull();
const afDialog = fix.nativeElement.querySelector('.igx-advanced-filter');
UIInteractions.triggerKeyDownEvtUponElem('Escape', afDialog);
tick(100);
fix.detectChanges();
// Verify AF dialog is closed.
header = GridFunctions.getColumnHeader('Name', fix);
expect(GridFunctions.getAdvancedFilteringComponent(fix)).toBeNull();
GridFunctions.verifyHeaderIsFocused(header.parent);
}));
it('Column selection: Should be able to select columns when columnSelection is multi', () => {
const columnID = grid.getColumnByName('ID');
const columnParentID = grid.getColumnByName('ParentID');
const columnName = grid.getColumnByName('Name');
columnName.selectable = false;
expect(grid.columnSelection).toEqual(GridSelectionMode.none);
let header = GridFunctions.getColumnHeader('ID', fix);
UIInteractions.simulateClickAndSelectEvent(header);
fix.detectChanges();
// Verify first header is focused
GridFunctions.verifyHeaderIsFocused(header.parent);
// Press space when the columnSelection is none
UIInteractions.triggerEventHandlerKeyDown('Space', gridHeader);
fix.detectChanges();
GridSelectionFunctions.verifyColumnAndCellsSelected(columnID, false);
grid.columnSelection = GridSelectionMode.multiple;
fix.detectChanges();
UIInteractions.triggerEventHandlerKeyDown('Space', gridHeader);
fix.detectChanges();
GridSelectionFunctions.verifyColumnAndCellsSelected(columnID);
UIInteractions.triggerEventHandlerKeyDown('ArrowRight', gridHeader);
fix.detectChanges();
header = GridFunctions.getColumnHeader('ParentID', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
UIInteractions.triggerEventHandlerKeyDown('Space', gridHeader);
fix.detectChanges();
GridSelectionFunctions.verifyColumnAndCellsSelected(columnID);
GridSelectionFunctions.verifyColumnAndCellsSelected(columnParentID);
UIInteractions.triggerEventHandlerKeyDown('Space', gridHeader);
fix.detectChanges();
GridSelectionFunctions.verifyColumnAndCellsSelected(columnID);
GridSelectionFunctions.verifyColumnAndCellsSelected(columnParentID, false);
UIInteractions.triggerEventHandlerKeyDown('ArrowRight', gridHeader);
fix.detectChanges();
header = GridFunctions.getColumnHeader('Name', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
// Press Space on not selectable column
UIInteractions.triggerEventHandlerKeyDown('Space', gridHeader);
fix.detectChanges();
GridSelectionFunctions.verifyColumnAndCellsSelected(columnID);
GridSelectionFunctions.verifyColumnAndCellsSelected(columnName, false);
});
it('Column selection: Should be able to select columns when columnSelection is single', () => {
spyOn(grid.columnSelectionChanging, 'emit').and.callThrough();
const columnID = grid.getColumnByName('ID');
const columnParentID = grid.getColumnByName('ParentID');
const columnName = grid.getColumnByName('Name');
columnName.selectable = false;
grid.columnSelection = GridSelectionMode.single;
let header = GridFunctions.getColumnHeader('ID', fix);
UIInteractions.simulateClickAndSelectEvent(header);
fix.detectChanges();
// Verify first header is focused
GridFunctions.verifyHeaderIsFocused(header.parent);
GridSelectionFunctions.verifyColumnAndCellsSelected(columnID);
UIInteractions.triggerEventHandlerKeyDown('ArrowRight', gridHeader);
fix.detectChanges();
header = GridFunctions.getColumnHeader('ParentID', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
UIInteractions.triggerEventHandlerKeyDown('Space', gridHeader);
fix.detectChanges();
GridSelectionFunctions.verifyColumnAndCellsSelected(columnID, false);
GridSelectionFunctions.verifyColumnAndCellsSelected(columnParentID);
UIInteractions.triggerEventHandlerKeyDown('Space', gridHeader);
fix.detectChanges();
GridSelectionFunctions.verifyColumnAndCellsSelected(columnParentID, false);
UIInteractions.triggerEventHandlerKeyDown('ArrowRight', gridHeader);
fix.detectChanges();
header = GridFunctions.getColumnHeader('Name', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
// Press Space on not selectable column
UIInteractions.triggerEventHandlerKeyDown('Space', gridHeader);
fix.detectChanges();
GridSelectionFunctions.verifyColumnAndCellsSelected(columnName, false);
expect(grid.columnSelectionChanging.emit).toHaveBeenCalledTimes(3);
});
it('Group by: Should be able group columns with keyboard', () => {
spyOn(grid.groupingDone, 'emit').and.callThrough();
grid.getColumnByName('ID').groupable = true;
grid.getColumnByName('Name').groupable = true;
let header = GridFunctions.getColumnHeader('ID', fix);
UIInteractions.simulateClickAndSelectEvent(header);
fix.detectChanges();
// Verify first header is focused
GridFunctions.verifyHeaderIsFocused(header.parent);
UIInteractions.triggerEventHandlerKeyDown('ArrowRight', gridHeader, true, true);
fix.detectChanges();
expect(grid.groupingExpressions.length).toEqual(1);
expect(grid.groupingExpressions[0].fieldName).toEqual('ID');
UIInteractions.triggerEventHandlerKeyDown('ArrowRight', gridHeader);
fix.detectChanges();
// Try to group not groupable column
header = GridFunctions.getColumnHeader('ParentID', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
UIInteractions.triggerEventHandlerKeyDown('ArrowRight', gridHeader, true, true);
fix.detectChanges();
expect(grid.groupingExpressions.length).toEqual(1);
UIInteractions.triggerEventHandlerKeyDown('ArrowRight', gridHeader);
fix.detectChanges();
header = GridFunctions.getColumnHeader('Name', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
// Press Space on not selectable column
UIInteractions.triggerEventHandlerKeyDown('ArrowRight', gridHeader, true, true);
fix.detectChanges();
expect(grid.groupingExpressions.length).toEqual(2);
expect(grid.groupingExpressions[0].fieldName).toEqual('ID');
expect(grid.groupingExpressions[1].fieldName).toEqual('Name');
// Ungroup column
UIInteractions.triggerEventHandlerKeyDown('ArrowLeft', gridHeader, true, true);
fix.detectChanges();
expect(grid.groupingExpressions.length).toEqual(1);
expect(grid.groupingExpressions[0].fieldName).toEqual('ID');
// Ungroup not grouped column
UIInteractions.triggerEventHandlerKeyDown('ArrowLeft', gridHeader, true, true);
fix.detectChanges();
expect(grid.groupingExpressions.length).toEqual(1);
expect(grid.groupingExpressions[0].fieldName).toEqual('ID');
expect(grid.groupingDone.emit).toHaveBeenCalled();
});
it('Group by: Should be able group columns with keyboard when hideGroupedColumns is true', fakeAsync(() => {
grid.width = '1000px';
grid.hideGroupedColumns = true;
grid.columns.forEach(c => c.groupable = true);
fix.detectChanges();
tick(100);
let header = GridFunctions.getColumnHeader('ID', fix);
UIInteractions.simulateClickAndSelectEvent(header);
fix.detectChanges();
// Group by first column
UIInteractions.triggerEventHandlerKeyDown('ArrowRight', gridHeader, true, true);
tick(100);
fix.detectChanges();
header = GridFunctions.getColumnHeader('ParentID', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
expect(grid.groupingExpressions.length).toEqual(1);
expect(grid.groupingExpressions[0].fieldName).toEqual('ID');
GridFunctions.verifyColumnIsHidden(grid.getColumnByName('ID'), true, 5);
// Go to last column
UIInteractions.triggerEventHandlerKeyDown('End', gridHeader);
fix.detectChanges();
// Try to group not groupable column
header = GridFunctions.getColumnHeader('OnPTO', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
UIInteractions.triggerEventHandlerKeyDown('ArrowRight', gridHeader, true, true);
tick(100);
fix.detectChanges();
header = GridFunctions.getColumnHeader('Age', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
expect(grid.groupingExpressions.length).toEqual(2);
expect(grid.groupingExpressions[0].fieldName).toEqual('ID');
expect(grid.groupingExpressions[1].fieldName).toEqual('OnPTO');
GridFunctions.verifyColumnIsHidden(grid.getColumnByName('OnPTO'), true, 4);
UIInteractions.triggerEventHandlerKeyDown('ArrowLeft', gridHeader);
fix.detectChanges();
header = GridFunctions.getColumnHeader('HireDate', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
}));
it('Group by: Should respect column properties when grouping with keyboard', () => {
grid.sort({ fieldName: 'ID', dir: SortingDirection.Desc });
let sortStrategy: ISortingStrategy;
const comparer = (a: string, b: string) => (a.toLowerCase() === b.toLowerCase() ? 0 : -1);
const column = grid.getColumnByName('ID');
column.groupable = true;
column.sortingIgnoreCase = false;
column.sortStrategy = sortStrategy;
column.groupingComparer = comparer;
(grid.navigation as any).performHeaderKeyCombination(column, 'arrowright', true, false, true);
expect(grid.groupingExpressions[0].fieldName).toEqual(column.field);
expect(grid.groupingExpressions[0].dir).toEqual(2);
expect(grid.groupingExpressions[0].ignoreCase).toEqual(false);
expect(grid.groupingExpressions[0].strategy).toBeUndefined();
expect(grid.groupingExpressions[0].groupingComparer).toEqual(comparer);
});
});
describe('MRL Headers Navigation', () => {
let fix;
let grid: IgxGridComponent;
let gridHeader: IgxGridHeaderRowComponent;
configureTestSuite((() => {
return TestBed.configureTestingModule({
imports: [MRLTestComponent, NoopAnimationsModule]
});
}));
beforeEach(() => {
fix = TestBed.createComponent(MRLTestComponent);
fix.detectChanges();
grid = fix.componentInstance.grid;
setupGridScrollDetection(fix, grid);
fix.detectChanges();
gridHeader = GridFunctions.getGridHeader(grid);
});
afterEach(() => {
clearGridSubs();
});
it('should navigate through a layout with right and left arrow keys in first level', async () => {
let header = GridFunctions.getColumnHeader('CompanyName', fix);
UIInteractions.simulateClickAndSelectEvent(header);
fix.detectChanges();
// Verify first header is focused
GridFunctions.verifyHeaderIsFocused(header.parent);
UIInteractions.triggerEventHandlerKeyDown('ArrowRight', gridHeader);
await wait(DEBOUNCETIME);
fix.detectChanges();
header = GridFunctions.getColumnHeader('City', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
UIInteractions.triggerEventHandlerKeyDown('ArrowRight', gridHeader);
await wait(DEBOUNCETIME);
fix.detectChanges();
header = GridFunctions.getColumnHeader('Country', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
UIInteractions.triggerEventHandlerKeyDown('ArrowRight', gridHeader);
await wait(DEBOUNCETIME);
fix.detectChanges();
header = GridFunctions.getColumnHeader('Phone', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
UIInteractions.triggerEventHandlerKeyDown('ArrowLeft', gridHeader);
await wait(DEBOUNCETIME);
fix.detectChanges();
header = GridFunctions.getColumnHeader('Country', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
UIInteractions.triggerEventHandlerKeyDown('ArrowLeft', gridHeader);
await wait(DEBOUNCETIME);
fix.detectChanges();
header = GridFunctions.getColumnHeader('City', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
UIInteractions.triggerEventHandlerKeyDown('ArrowLeft', gridHeader);
await wait(DEBOUNCETIME);
fix.detectChanges();
header = GridFunctions.getColumnHeader('CompanyName', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
});
it('should navigate through a layout with right and left arrow keys in second level', async () => {
let header = GridFunctions.getColumnHeader('ContactTitle', fix);
UIInteractions.simulateClickAndSelectEvent(header);
fix.detectChanges();
// Verify first header is focused
GridFunctions.verifyHeaderIsFocused(header.parent);
UIInteractions.triggerEventHandlerKeyDown('ArrowRight', gridHeader);
await wait(DEBOUNCETIME);
fix.detectChanges();
header = GridFunctions.getColumnHeader('City', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
UIInteractions.triggerEventHandlerKeyDown('ArrowRight', gridHeader);
await wait(DEBOUNCETIME);
fix.detectChanges();
header = GridFunctions.getColumnHeader('Fax', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
UIInteractions.triggerEventHandlerKeyDown('ArrowLeft', gridHeader);
await wait(DEBOUNCETIME);
fix.detectChanges();
header = GridFunctions.getColumnHeader('City', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
UIInteractions.triggerEventHandlerKeyDown('ArrowLeft', gridHeader);
await wait(DEBOUNCETIME);
fix.detectChanges();
header = GridFunctions.getColumnHeader('ContactTitle', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
UIInteractions.triggerEventHandlerKeyDown('ArrowLeft', gridHeader);
await wait(DEBOUNCETIME);
fix.detectChanges();
header = GridFunctions.getColumnHeader('ContactName', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
});
it('should navigate through a layout with home and end keys', async () => {
let header = GridFunctions.getColumnHeader('ContactTitle', fix);
UIInteractions.simulateClickAndSelectEvent(header);
fix.detectChanges();
// Verify first header is focused
GridFunctions.verifyHeaderIsFocused(header.parent);
UIInteractions.triggerEventHandlerKeyDown('ArrowRight', gridHeader, false, false, true);
await wait(DEBOUNCETIME);
fix.detectChanges();
header = GridFunctions.getColumnHeader('Fax', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
UIInteractions.triggerEventHandlerKeyDown('ArrowLeft', gridHeader, false, false, true);
await wait(DEBOUNCETIME);
fix.detectChanges();
header = GridFunctions.getColumnHeader('ContactName', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
header = GridFunctions.getColumnHeader('Address', fix);
UIInteractions.simulateClickAndSelectEvent(header);
fix.detectChanges();
UIInteractions.triggerEventHandlerKeyDown('End', gridHeader);
await wait(DEBOUNCETIME);
fix.detectChanges();
header = GridFunctions.getColumnHeader('Fax', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
UIInteractions.triggerEventHandlerKeyDown('home', gridHeader);
await wait(DEBOUNCETIME);
fix.detectChanges();
header = GridFunctions.getColumnHeader('Address', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
});
it('should navigate through a layout with up and down arrow keys', () => {
let header = GridFunctions.getColumnHeader('ContactTitle', fix);
UIInteractions.simulateClickAndSelectEvent(header);
fix.detectChanges();
// Verify first header is focused
GridFunctions.verifyHeaderIsFocused(header.parent);
UIInteractions.triggerEventHandlerKeyDown('ArrowUp', gridHeader);
fix.detectChanges();
header = GridFunctions.getColumnHeader('CompanyName', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
UIInteractions.triggerEventHandlerKeyDown('ArrowDown', gridHeader);
fix.detectChanges();
header = GridFunctions.getColumnHeader('ContactTitle', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
UIInteractions.triggerEventHandlerKeyDown('ArrowDown', gridHeader);
fix.detectChanges();
header = GridFunctions.getColumnHeader('Address', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
UIInteractions.triggerEventHandlerKeyDown('ArrowUp', gridHeader);
fix.detectChanges();
header = GridFunctions.getColumnHeader('ContactTitle', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
});
it('should focus the first element when focus the header', () => {
gridHeader.nativeElement.focus(); //('focus', null);
fix.detectChanges();
const header = GridFunctions.getColumnHeader('CompanyName', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
});
});
describe('MCH Headers Navigation', () => {
let fix;
let grid: IgxGridComponent;
let gridHeader: IgxGridHeaderRowComponent;
configureTestSuite((() => {
return TestBed.configureTestingModule({
imports: [ColumnGroupsNavigationTestComponent, NoopAnimationsModule]
});
}));
beforeEach(() => {
fix = TestBed.createComponent(ColumnGroupsNavigationTestComponent);
fix.detectChanges();
grid = fix.componentInstance.grid;
setupGridScrollDetection(fix, grid);
fix.detectChanges();
gridHeader = GridFunctions.getGridHeader(grid);
});
afterEach(() => {
clearGridSubs();
});
it('should navigate through groups with right and left arrow keys in first level', () => {
let header = GridFunctions.getColumnGroupHeaderCell('General Information', fix);
UIInteractions.simulateClickAndSelectEvent(header);
fix.detectChanges();
// Verify first header is focused
GridFunctions.verifyHeaderIsFocused(header);
UIInteractions.triggerEventHandlerKeyDown('ArrowRight', gridHeader);
fix.detectChanges();
header = GridFunctions.getColumnHeader('ID', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
UIInteractions.triggerEventHandlerKeyDown('ArrowRight', gridHeader);
fix.detectChanges();
header = GridFunctions.getColumnGroupHeaderCell('Address Information', fix);
GridFunctions.verifyHeaderIsFocused(header);
UIInteractions.triggerEventHandlerKeyDown('ArrowRight', gridHeader);
fix.detectChanges();
GridFunctions.verifyHeaderIsFocused(header);
UIInteractions.triggerEventHandlerKeyDown('ArrowLeft', gridHeader);
fix.detectChanges();
header = GridFunctions.getColumnHeader('ID', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
UIInteractions.triggerEventHandlerKeyDown('ArrowLeft', gridHeader);
fix.detectChanges();
header = GridFunctions.getColumnGroupHeaderCell('General Information', fix);
GridFunctions.verifyHeaderIsFocused(header);
UIInteractions.triggerEventHandlerKeyDown('ArrowLeft', gridHeader);
fix.detectChanges();
header = GridFunctions.getColumnGroupHeaderCell('General Information', fix);
GridFunctions.verifyHeaderIsFocused(header);
});
it('should navigate through groups with right and left arrow keys in child level', () => {
let header = GridFunctions.getColumnHeader('ContactTitle', fix);
UIInteractions.simulateClickAndSelectEvent(header);
fix.detectChanges();
// Verify first header is focused
GridFunctions.verifyHeaderIsFocused(header.parent);
UIInteractions.triggerEventHandlerKeyDown('ArrowRight', gridHeader);
fix.detectChanges();
header = GridFunctions.getColumnHeader('ID', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
UIInteractions.triggerEventHandlerKeyDown('ArrowRight', gridHeader);
fix.detectChanges();
header = GridFunctions.getColumnHeader('Region', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
UIInteractions.triggerEventHandlerKeyDown('ArrowRight', gridHeader);
fix.detectChanges();
header = GridFunctions.getColumnHeader('Country', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
UIInteractions.triggerEventHandlerKeyDown('ArrowRight', gridHeader);
fix.detectChanges();
header = GridFunctions.getColumnGroupHeaderCell('City Information', fix);
GridFunctions.verifyHeaderIsFocused(header);
UIInteractions.triggerEventHandlerKeyDown('ArrowLeft', gridHeader);
fix.detectChanges();
header = GridFunctions.getColumnHeader('Country', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
UIInteractions.triggerEventHandlerKeyDown('ArrowLeft', gridHeader);
fix.detectChanges();
header = GridFunctions.getColumnHeader('Region', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
UIInteractions.triggerEventHandlerKeyDown('ArrowLeft', gridHeader);
fix.detectChanges();
header = GridFunctions.getColumnHeader('ID', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
UIInteractions.triggerEventHandlerKeyDown('ArrowLeft', gridHeader);
fix.detectChanges();
header = GridFunctions.getColumnHeader('ContactTitle', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
});
it('should navigate through groups with Home and End keys', () => {
let header = GridFunctions.getColumnHeader('ID', fix);
UIInteractions.simulateClickAndSelectEvent(header);
fix.detectChanges();
// Verify first header is focused
GridFunctions.verifyHeaderIsFocused(header.parent);
UIInteractions.triggerEventHandlerKeyDown('ArrowRight', gridHeader, false, false, true);
fix.detectChanges();
header = GridFunctions.getColumnGroupHeaderCell('Address Information', fix);
GridFunctions.verifyHeaderIsFocused(header);
UIInteractions.triggerEventHandlerKeyDown('ArrowLeft', gridHeader, false, false, true);
fix.detectChanges();
header = GridFunctions.getColumnGroupHeaderCell('General Information', fix);
GridFunctions.verifyHeaderIsFocused(header);
header = GridFunctions.getColumnHeader('City', fix);
UIInteractions.simulateClickAndSelectEvent(header);
fix.detectChanges();
// Verify first header is focused
GridFunctions.verifyHeaderIsFocused(header.parent);
UIInteractions.triggerEventHandlerKeyDown('Home', gridHeader);
fix.detectChanges();
header = GridFunctions.getColumnHeader('CompanyName', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
UIInteractions.triggerEventHandlerKeyDown('End', gridHeader);
fix.detectChanges();
header = GridFunctions.getColumnHeader('Address', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
});
it('should navigate through groups with arrowUp and down keys', () => {
let header = GridFunctions.getColumnHeader('City', fix);
UIInteractions.simulateClickAndSelectEvent(header);
fix.detectChanges();
// Verify first header is focused
GridFunctions.verifyHeaderIsFocused(header.parent);
UIInteractions.triggerEventHandlerKeyDown('ArrowUp', gridHeader);
fix.detectChanges();
header = GridFunctions.getColumnGroupHeaderCell('City Information', fix);
GridFunctions.verifyHeaderIsFocused(header);
UIInteractions.triggerEventHandlerKeyDown('ArrowUp', gridHeader);
fix.detectChanges();
header = GridFunctions.getColumnGroupHeaderCell('Country Information', fix);
GridFunctions.verifyHeaderIsFocused(header);
UIInteractions.triggerEventHandlerKeyDown('ArrowUp', gridHeader);
fix.detectChanges();
header = GridFunctions.getColumnGroupHeaderCell('Address Information', fix);
GridFunctions.verifyHeaderIsFocused(header);
UIInteractions.triggerEventHandlerKeyDown('ArrowDown', gridHeader);
fix.detectChanges();
header = GridFunctions.getColumnGroupHeaderCell('Country Information', fix);
GridFunctions.verifyHeaderIsFocused(header);
UIInteractions.triggerEventHandlerKeyDown('ArrowDown', gridHeader);
fix.detectChanges();
header = GridFunctions.getColumnGroupHeaderCell('City Information', fix);
GridFunctions.verifyHeaderIsFocused(header);
UIInteractions.triggerEventHandlerKeyDown('ArrowDown', gridHeader);
fix.detectChanges();
header = GridFunctions.getColumnHeader('City', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
UIInteractions.triggerEventHandlerKeyDown('ArrowDown', gridHeader);
fix.detectChanges();
GridFunctions.verifyHeaderIsFocused(header.parent);
// click on parent
header = GridFunctions.getColumnGroupHeaderCell('Address Information', fix);
UIInteractions.simulateClickAndSelectEvent(header);
fix.detectChanges();
GridFunctions.verifyHeaderIsFocused(header);
UIInteractions.triggerEventHandlerKeyDown('ArrowDown', gridHeader);
fix.detectChanges();
header = GridFunctions.getColumnHeader('Region', fix);
GridFunctions.verifyHeaderIsFocused(header.parent);
});
it('should focus the first element when focus the header', () => {
gridHeader.nativeElement.focus(); //('focus', null);
fix.detectChanges();
let header = GridFunctions.getColumnGroupHeaderCell('General Information', fix);
GridFunctions.verifyHeaderIsFocused(header);
// Verify children are not focused
header = GridFunctions.getColumnGroupHeaderCell('Person Details', fix);
GridFunctions.verifyHeaderIsFocused(header, false);
header = GridFunctions.getColumnGroupHeaderCell('Person Details', fix);
GridFunctions.verifyHeaderIsFocused(header, false);
header = GridFunctions.getColumnHeader('CompanyName', fix);
GridFunctions.verifyHeaderIsFocused(header.parent, false);
});
it('should be able to expand collapse column group with the keyboard', () => {
const getInfGroup = GridFunctions.getColGroup(grid, 'General Information');
const personDetailsGroup = GridFunctions.getColGroup(grid, 'Person Details');
const companyName = grid.getColumnByName('CompanyName');
getInfGroup.collapsible = true;
personDetailsGroup.visibleWhenCollapsed = true;
companyName.visibleWhenCollapsed = false;
fix.detectChanges();
GridFunctions.verifyColumnIsHidden(companyName, false, 10);
GridFunctions.verifyGroupIsExpanded(fix, getInfGroup);
gridHeader.nativeElement.focus(); //('focus', null);
fix.detectChanges();
const header = GridFunctions.getColumnGroupHeaderCell('General Information', fix);
GridFunctions.verifyHeaderIsFocused(header);
UIInteractions.triggerEv