Skip to content

Commit f98478f

Browse files
authored
Merge branch '8.1.x' into fix-for-5432-master
2 parents 5d4d253 + f030eb2 commit f98478f

File tree

10 files changed

+143
-21
lines changed

10 files changed

+143
-21
lines changed

projects/igniteui-angular/src/lib/core/styles/components/grid/_excel-filtering-component.scss

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,11 @@
6868
@extend %grid-excel-actions__action !optional;
6969
}
7070

71+
@include e(actions-pin, $m: disabled) {
72+
@extend %grid-excel-actions__action !optional;
73+
@extend %grid-excel-actions__action--disabled !optional;
74+
}
75+
7176
@include e(actions-unpin) {
7277
@extend %grid-excel-actions__action !optional;
7378
}

projects/igniteui-angular/src/lib/core/utils.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ export const enum KEYS {
170170
*/
171171
export function getNodeSizeViaRange(range: Range, node: any): number {
172172
let overflow = null;
173-
if (isIE() || isEdge()) {
173+
if (!isFirefox()) {
174174
overflow = node.style.overflow;
175175
// we need that hack - otherwise content won't be measured correctly in IE/Edge
176176
node.style.overflow = 'visible';
@@ -179,7 +179,7 @@ export function getNodeSizeViaRange(range: Range, node: any): number {
179179
range.selectNodeContents(node);
180180
const width = range.getBoundingClientRect().width;
181181

182-
if (isIE() || isEdge()) {
182+
if (!isFirefox()) {
183183
// we need that hack - otherwise content won't be measured correctly in IE/Edge
184184
node.style.overflow = overflow;
185185
}

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

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1391,9 +1391,7 @@ export class IgxColumnComponent implements AfterContentInit {
13911391
return false;
13921392
}
13931393

1394-
const width = parseInt(this.width, 10);
1395-
1396-
if (!this.parent && (grid.getUnpinnedWidth(true) - width < grid.unpinnedAreaMinWidth)) {
1394+
if (!this.parent && !this.pinnable) {
13971395
return false;
13981396
}
13991397

@@ -1684,6 +1682,15 @@ export class IgxColumnComponent implements AfterContentInit {
16841682
this.calcPixelWidth = parseInt(this._calcWidth, 10);
16851683
}
16861684

1685+
/**
1686+
*@hidden
1687+
*/
1688+
public get pinnable() {
1689+
const gridUnpinnedWidth = (this.grid as any).getUnpinnedWidth(true);
1690+
const columnWidth = parseInt(this.width, 10);
1691+
return !((gridUnpinnedWidth - columnWidth) < this.grid.unpinnedAreaMinWidth);
1692+
}
1693+
16871694
/**
16881695
* @hidden
16891696
*/

projects/igniteui-angular/src/lib/grids/filtering/excel-style/excel-style-column-moving.component.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ export class IgxExcelStyleColumnMovingComponent {
2323
@Input()
2424
public displayDensity: DisplayDensity;
2525

26+
@Input()
27+
public isColumnPinnable: boolean;
28+
2629
constructor() {}
2730

2831
private get visibleColumns() {
@@ -32,6 +35,7 @@ export class IgxExcelStyleColumnMovingComponent {
3235
get canNotMoveLeft() {
3336
return this.column.visibleIndex === 0 ||
3437
(this.grid.unpinnedColumns.indexOf(this.column) === 0 && this.column.disablePinning) ||
38+
(this.grid.unpinnedColumns.indexOf(this.column) === 0 && !this.isColumnPinnable) ||
3539
(this.column.level !== 0 && !this.findColumn(0, this.visibleColumns));
3640
}
3741

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ <h4>{{ column.header || column.field }}</h4>
1414
igxButton="icon"
1515
[displayDensity]="grid.displayDensity"
1616
(click)="onPin()"
17+
[disabled]="!isColumnPinnable"
1718
tabindex="0">
1819
<igx-icon fontSet="filtering-icons" name="pin"></igx-icon>
1920
</button>
@@ -54,6 +55,7 @@ <h4>{{ column.header || column.field }}</h4>
5455
class="igx-excel-filter__move"
5556
[column]="column"
5657
[grid]="grid"
58+
[isColumnPinnable]="isColumnPinnable"
5759
[displayDensity]="grid.displayDensity">
5860
</igx-excel-style-column-moving>
5961
</ng-template>
@@ -63,7 +65,7 @@ <h4>{{ column.header || column.field }}</h4>
6365
</div>
6466

6567
<ng-template #defaultExcelStylePinningTemplate>
66-
<div class="igx-excel-filter__actions-pin"
68+
<div [ngClass]="pinClass()"
6769
(click)="onPin()"
6870
tabindex="0"
6971
*ngIf="!column.pinned">

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

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ import {
88
Directive,
99
OnDestroy,
1010
AfterViewInit,
11-
ElementRef
11+
ElementRef,
12+
OnInit
1213
} from '@angular/core';
1314
import {
1415
HorizontalAlignment,
@@ -87,7 +88,7 @@ export class IgxExcelStylePinningTemplateDirective {
8788
selector: 'igx-grid-excel-style-filtering',
8889
templateUrl: './grid.excel-style-filtering.component.html'
8990
})
90-
export class IgxGridExcelStyleFilteringComponent implements OnDestroy, AfterViewInit {
91+
export class IgxGridExcelStyleFilteringComponent implements OnDestroy, OnInit, AfterViewInit {
9192
private static readonly filterOptimizationThreshold = 2;
9293

9394
private shouldOpenSubMenu = true;
@@ -148,6 +149,8 @@ export class IgxGridExcelStyleFilteringComponent implements OnDestroy, AfterView
148149
@ViewChild('defaultExcelStylePinningTemplate', { read: TemplateRef, static: true })
149150
protected defaultExcelStylePinningTemplate: TemplateRef<any>;
150151

152+
public isColumnPinnable: boolean;
153+
151154
get grid(): any {
152155
return this.filteringService.grid;
153156
}
@@ -171,6 +174,10 @@ export class IgxGridExcelStyleFilteringComponent implements OnDestroy, AfterView
171174

172175
constructor(private cdr: ChangeDetectorRef) {}
173176

177+
ngOnInit() {
178+
this.isColumnPinnable = this.column.pinnable;
179+
}
180+
174181
ngOnDestroy(): void {
175182
this.destroy$.next(true);
176183
this.destroy$.complete();
@@ -205,6 +212,10 @@ export class IgxGridExcelStyleFilteringComponent implements OnDestroy, AfterView
205212
return 'igx-excel-filter__actions-clear--disabled';
206213
}
207214

215+
public pinClass() {
216+
return this.isColumnPinnable ? 'igx-excel-filter__actions-pin' : 'igx-excel-filter__actions-pin--disabled';
217+
}
218+
208219
public initialize(column: IgxColumnComponent, filteringService: IgxFilteringService, overlayService: IgxOverlayService,
209220
overlayComponentId: string) {
210221
this.column = column;

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -687,7 +687,8 @@ describe('IgxGrid - Deferred Column Resizing', () => {
687687

688688
column.autosize();
689689
fixture.detectChanges();
690-
expect(column.width).toEqual('119px');
690+
// the exact width is different between chrome and chrome headless so an exact match is erroneous
691+
expect(Math.abs(parseInt(column.width, 10) - 120)).toBeLessThan(2);
691692

692693
// height/width setter rAF
693694
await wait(16);

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

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5361,6 +5361,96 @@ describe('IgxGrid - Filtering actions - Excel style filtering', () => {
53615361

53625362
expect(grid.filteredData).toBeNull();
53635363
}));
5364+
5365+
it('Move-left button is disabled when using it to pin a column and max pin area width is reached.',
5366+
fakeAsync(() => {
5367+
// Test prerequisites
5368+
grid.width = '500px';
5369+
fix.detectChanges();
5370+
grid.getColumnByName('ID').filterable = true;
5371+
grid.getColumnByName('ID').movable = true;
5372+
grid.cdr.detectChanges();
5373+
tick(100);
5374+
5375+
// Pin columns until maximum pin area width is reached.
5376+
const columns = ['ProductName', 'Downloads', 'Released'];
5377+
columns.forEach((columnField) => {
5378+
GridFunctions.clickExcelFilterIcon(fix, columnField);
5379+
fix.detectChanges();
5380+
GridFunctions.clickPinIconInExcelStyleFiltering(fix, false);
5381+
tick(200);
5382+
fix.detectChanges();
5383+
});
5384+
5385+
// Verify pinned columns and 'ID' column position.
5386+
const column = grid.columns.find((col) => col.field === 'ID');
5387+
GridFunctions.verifyColumnIsPinned(column, false, 3);
5388+
expect(GridFunctions.getColumnHeaderByIndex(fix, 3).innerText).toBe('ID');
5389+
5390+
// Open ESF for the 'ID' column and verify that 'move left' button is disabled.
5391+
GridFunctions.clickExcelFilterIcon(fix, 'ID');
5392+
fix.detectChanges();
5393+
const moveComponent = GridFunctions.getExcelFilteringMoveComponent(fix);
5394+
const moveLeftButton = GridFunctions.sortNativeElementsHorizontally(
5395+
Array.from(moveComponent.querySelectorAll('.igx-button--flat')))[0];
5396+
expect(moveLeftButton.classList.contains('igx-button--disabled')).toBe(true);
5397+
}));
5398+
5399+
it('Pin button is disabled when using it to pin a column and max pin area width is reached.',
5400+
fakeAsync(() => {
5401+
// Test prerequisites
5402+
grid.width = '500px';
5403+
fix.detectChanges();
5404+
grid.getColumnByName('ID').filterable = true;
5405+
grid.getColumnByName('ID').movable = true;
5406+
grid.cdr.detectChanges();
5407+
tick(100);
5408+
5409+
// Pin columns until maximum pin area width is reached.
5410+
const columns = ['ProductName', 'Downloads', 'Released'];
5411+
columns.forEach((columnField) => {
5412+
GridFunctions.clickExcelFilterIcon(fix, columnField);
5413+
fix.detectChanges();
5414+
GridFunctions.clickPinIconInExcelStyleFiltering(fix, false);
5415+
tick(200);
5416+
fix.detectChanges();
5417+
});
5418+
5419+
// Verify pinned columns and 'ID' column position.
5420+
const column = grid.columns.find((col) => col.field === 'ID');
5421+
GridFunctions.verifyColumnIsPinned(column, false, 3);
5422+
expect(GridFunctions.getColumnHeaderByIndex(fix, 3).innerText).toBe('ID');
5423+
5424+
// Open ESF for the 'ID' column and verify that 'pin column' button is disabled.
5425+
GridFunctions.clickExcelFilterIcon(fix, 'ID');
5426+
fix.detectChanges();
5427+
let pinButton = GridFunctions.getExcelFilteringPinContainer(fix);
5428+
expect(pinButton.classList.contains('igx-excel-filter__actions-pin--disabled')).toBe(true,
5429+
'pinButton should be disabled');
5430+
5431+
// Close ESF.
5432+
GridFunctions.clickCancelExcelStyleFiltering(fix);
5433+
fix.detectChanges();
5434+
5435+
grid.displayDensity = DisplayDensity.compact;
5436+
tick(200);
5437+
fix.detectChanges();
5438+
5439+
// Pin one more column, because there is enough space for one more in 'compact' density.
5440+
GridFunctions.clickExcelFilterIcon(fix, 'ReleaseDate');
5441+
fix.detectChanges();
5442+
GridFunctions.clickPinIconInExcelStyleFiltering(fix, true);
5443+
tick(200);
5444+
fix.detectChanges();
5445+
5446+
// Open ESF for the 'ID' column and verify that 'pin column' icon button is disabled.
5447+
GridFunctions.clickExcelFilterIcon(fix, 'ID');
5448+
fix.detectChanges();
5449+
const headerButtons = GridFunctions.getExcelFilteringHeaderIcons(fix);
5450+
pinButton = GridFunctions.sortNativeElementsHorizontally(Array.from(headerButtons))[0];
5451+
expect(pinButton.classList.contains('igx-button--disabled')).toBe(true,
5452+
'pinButton in header area should be disabled');
5453+
}));
53645454
});
53655455

53665456
describe(null, () => {

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

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -166,9 +166,8 @@ describe('IgxGrid - multi-row-layout', () => {
166166
verifyLayoutHeadersAreAligned(headerCells, firstRowCells);
167167

168168
// verify block style
169-
let groupHeaderBlocks = fixture.debugElement.query(By.css('.igx-grid__thead')).queryAll(By.css(GRID_MRL_BLOCK));
170-
expect(groupHeaderBlocks[0].nativeElement.style.gridTemplateColumns).toBe('200px 200px 200px');
171-
expect(groupHeaderBlocks[0].nativeElement.style.gridTemplateRows).toBe('1fr 1fr 1fr');
169+
expect(grid.columnList.first.getGridTemplate(false, false)).toBe('200px 200px 200px');
170+
expect(grid.columnList.first.getGridTemplate(true, false)).toBe('repeat(3,1fr)');
172171

173172
// creating an incomplete layout 2
174173
fixture.componentInstance.colGroups = [{
@@ -183,9 +182,8 @@ describe('IgxGrid - multi-row-layout', () => {
183182
fixture.componentInstance.grid.width = '617px';
184183
fixture.detectChanges();
185184

186-
groupHeaderBlocks = fixture.debugElement.query(By.css('.igx-grid__thead')).queryAll(By.css(GRID_MRL_BLOCK));
187-
expect(groupHeaderBlocks[0].nativeElement.style.gridTemplateColumns).toBe('200px 200px 200px');
188-
expect(groupHeaderBlocks[0].nativeElement.style.gridTemplateRows).toBe('1fr 1fr 1fr');
185+
expect(grid.columnList.first.getGridTemplate(false, false)).toBe('200px 200px 200px');
186+
expect(grid.columnList.first.getGridTemplate(true, false)).toBe('repeat(3,1fr)');
189187

190188
});
191189
it('should initialize correctly when no column widths are set.', () => {
@@ -854,14 +852,16 @@ describe('IgxGrid - multi-row-layout', () => {
854852

855853
// check first group has height of 2 row spans in header and rows but the header itself should span 1 row
856854
// check group block and column header height
857-
const groupHeaderBlocks = fixture.debugElement.query(By.css('.igx-grid__thead')).queryAll(By.css(GRID_MRL_BLOCK));
855+
const firstLayout = grid.columnList.toArray()[0];
858856
expect(grid.multiRowLayoutRowSize).toEqual(2);
859-
expect(groupHeaderBlocks[0].nativeElement.style.gridTemplateRows).toEqual('1fr 1fr');
860-
expect(groupHeaderBlocks[0].nativeElement.offsetHeight).toBe((grid.rowHeight + 1) * 2);
857+
expect(firstLayout.getGridTemplate(true, false)).toEqual('repeat(2,1fr)');
858+
expect(firstLayout.headerGroup.element.nativeElement.offsetHeight).toBe((grid.rowHeight + 1) * 2);
861859
expect(grid.getColumnByName('Fax').headerCell.elementRef.nativeElement.offsetHeight).toBe(grid.rowHeight + 1);
862860

863-
expect(groupHeaderBlocks[1].nativeElement.style.gridTemplateRows).toEqual('1fr 1fr');
864-
expect(groupHeaderBlocks[1].nativeElement.offsetHeight).toBe((grid.rowHeight + 1) * 2);
861+
const secondLayout = grid.columnList.toArray()[2];
862+
const contactNameColumn = grid.getColumnByName('ContactName');
863+
expect(contactNameColumn.getGridTemplate(true, false)).toEqual('repeat(2,1fr)');
864+
expect(secondLayout.headerGroup.element.nativeElement.offsetHeight).toBe((grid.rowHeight + 1) * 2);
865865

866866
// check cell height in row. By default should span 1 row
867867
const firstCell = grid.getCellByColumn(0, 'Fax').nativeElement;

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -715,7 +715,9 @@ export class GridFunctions {
715715
public static getExcelFilteringPinContainer(fix: ComponentFixture<any>) {
716716
const gridNativeElement = fix.debugElement.query(By.css('igx-grid')).nativeElement;
717717
const excelMenu = gridNativeElement.querySelector('.igx-excel-filter__menu');
718-
return excelMenu.querySelector('.igx-excel-filter__actions-pin');
718+
const pinContainer = excelMenu.querySelector('.igx-excel-filter__actions-pin');
719+
const pinContainerDisabled = excelMenu.querySelector('.igx-excel-filter__actions-pin--disabled');
720+
return pinContainer ? pinContainer : pinContainerDisabled;
719721
}
720722

721723
public static getExcelFilteringUnpinContainer(fix: ComponentFixture<any>) {

0 commit comments

Comments
 (0)