Skip to content

Commit d213000

Browse files
Merge branch '8.1.x' into astaev/issue5304-8.1.x
2 parents 0aa4db5 + a1fb095 commit d213000

File tree

7 files changed

+128
-7
lines changed

7 files changed

+128
-7
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/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/grid-filtering-ui.spec.ts

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

54295429
expect(grid.filteredData).toBeNull();
54305430
}));
5431+
5432+
it('Move-left button is disabled when using it to pin a column and max pin area width is reached.',
5433+
fakeAsync(() => {
5434+
// Test prerequisites
5435+
grid.width = '500px';
5436+
fix.detectChanges();
5437+
grid.getColumnByName('ID').filterable = true;
5438+
grid.getColumnByName('ID').movable = true;
5439+
grid.cdr.detectChanges();
5440+
tick(100);
5441+
5442+
// Pin columns until maximum pin area width is reached.
5443+
const columns = ['ProductName', 'Downloads', 'Released'];
5444+
columns.forEach((columnField) => {
5445+
GridFunctions.clickExcelFilterIcon(fix, columnField);
5446+
fix.detectChanges();
5447+
GridFunctions.clickPinIconInExcelStyleFiltering(fix, false);
5448+
tick(200);
5449+
fix.detectChanges();
5450+
});
5451+
5452+
// Verify pinned columns and 'ID' column position.
5453+
const column = grid.columns.find((col) => col.field === 'ID');
5454+
GridFunctions.verifyColumnIsPinned(column, false, 3);
5455+
expect(GridFunctions.getColumnHeaderByIndex(fix, 3).innerText).toBe('ID');
5456+
5457+
// Open ESF for the 'ID' column and verify that 'move left' button is disabled.
5458+
GridFunctions.clickExcelFilterIcon(fix, 'ID');
5459+
fix.detectChanges();
5460+
const moveComponent = GridFunctions.getExcelFilteringMoveComponent(fix);
5461+
const moveLeftButton = GridFunctions.sortNativeElementsHorizontally(
5462+
Array.from(moveComponent.querySelectorAll('.igx-button--flat')))[0];
5463+
expect(moveLeftButton.classList.contains('igx-button--disabled')).toBe(true);
5464+
}));
5465+
5466+
it('Pin button is disabled when using it to pin a column and max pin area width is reached.',
5467+
fakeAsync(() => {
5468+
// Test prerequisites
5469+
grid.width = '500px';
5470+
fix.detectChanges();
5471+
grid.getColumnByName('ID').filterable = true;
5472+
grid.getColumnByName('ID').movable = true;
5473+
grid.cdr.detectChanges();
5474+
tick(100);
5475+
5476+
// Pin columns until maximum pin area width is reached.
5477+
const columns = ['ProductName', 'Downloads', 'Released'];
5478+
columns.forEach((columnField) => {
5479+
GridFunctions.clickExcelFilterIcon(fix, columnField);
5480+
fix.detectChanges();
5481+
GridFunctions.clickPinIconInExcelStyleFiltering(fix, false);
5482+
tick(200);
5483+
fix.detectChanges();
5484+
});
5485+
5486+
// Verify pinned columns and 'ID' column position.
5487+
const column = grid.columns.find((col) => col.field === 'ID');
5488+
GridFunctions.verifyColumnIsPinned(column, false, 3);
5489+
expect(GridFunctions.getColumnHeaderByIndex(fix, 3).innerText).toBe('ID');
5490+
5491+
// Open ESF for the 'ID' column and verify that 'pin column' button is disabled.
5492+
GridFunctions.clickExcelFilterIcon(fix, 'ID');
5493+
fix.detectChanges();
5494+
let pinButton = GridFunctions.getExcelFilteringPinContainer(fix);
5495+
expect(pinButton.classList.contains('igx-excel-filter__actions-pin--disabled')).toBe(true,
5496+
'pinButton should be disabled');
5497+
5498+
// Close ESF.
5499+
GridFunctions.clickCancelExcelStyleFiltering(fix);
5500+
fix.detectChanges();
5501+
5502+
grid.displayDensity = DisplayDensity.compact;
5503+
tick(200);
5504+
fix.detectChanges();
5505+
5506+
// Pin one more column, because there is enough space for one more in 'compact' density.
5507+
GridFunctions.clickExcelFilterIcon(fix, 'ReleaseDate');
5508+
fix.detectChanges();
5509+
GridFunctions.clickPinIconInExcelStyleFiltering(fix, true);
5510+
tick(200);
5511+
fix.detectChanges();
5512+
5513+
// Open ESF for the 'ID' column and verify that 'pin column' icon button is disabled.
5514+
GridFunctions.clickExcelFilterIcon(fix, 'ID');
5515+
fix.detectChanges();
5516+
const headerButtons = GridFunctions.getExcelFilteringHeaderIcons(fix);
5517+
pinButton = GridFunctions.sortNativeElementsHorizontally(Array.from(headerButtons))[0];
5518+
expect(pinButton.classList.contains('igx-button--disabled')).toBe(true,
5519+
'pinButton in header area should be disabled');
5520+
}));
54315521
});
54325522

54335523
describe(null, () => {

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)