Skip to content

Commit d4c72f9

Browse files
authored
Merge pull request #6775 from IgniteUI/mkirova/pinning-conf-rowSelectors
Right Pinning + Row Selectors Integration
2 parents a2c28e5 + 5905ea5 commit d4c72f9

File tree

6 files changed

+70
-7
lines changed

6 files changed

+70
-7
lines changed

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -1003,8 +1003,8 @@ export class IgxColumnComponent implements AfterContentInit {
10031003
}
10041004

10051005
get rightPinnedOffset(): string {
1006-
return this.pinned ?
1007-
- this.grid.pinnedWidth + 'px' :
1006+
return this.pinned && !this.grid.isPinningToStart ?
1007+
- this.grid.pinnedWidth - this.grid.headerFeaturesWidth + 'px' :
10081008
null;
10091009
}
10101010

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

+26-2
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,7 @@ export class IgxGridBaseDirective extends DisplayDensityBase implements
180180
private overlayIDs = [];
181181
private _filteringStrategy: IFilteringStrategy;
182182
private _sortingStrategy: IGridSortingStrategy;
183+
private _pinning: IPinningConfig = { columns: ColumnPinningPosition.Start };
183184

184185
private _hostWidth;
185186
private _advancedFilteringOverlayId: string;
@@ -813,7 +814,16 @@ export class IgxGridBaseDirective extends DisplayDensityBase implements
813814
* ```
814815
*/
815816
@Input()
816-
public pinning: IPinningConfig = { columns: ColumnPinningPosition.Start };
817+
get pinning() {
818+
return this._pinning;
819+
}
820+
set pinning(value) {
821+
if (value !== this._pinning) {
822+
this.resetCaches();
823+
}
824+
this._pinning = value;
825+
}
826+
817827

818828
/**
819829
* Gets/Sets if the built-in column pinning UI should be shown in the toolbar.
@@ -2520,6 +2530,14 @@ export class IgxGridBaseDirective extends DisplayDensityBase implements
25202530
this.hideOverlays();
25212531
}
25222532

2533+
/**
2534+
* @hidden
2535+
* @internal
2536+
*/
2537+
public get headerFeaturesWidth() {
2538+
return this._headerFeaturesWidth;
2539+
}
2540+
25232541
/**
25242542
* @hidden
25252543
* @internal
@@ -4651,7 +4669,9 @@ export class IgxGridBaseDirective extends DisplayDensityBase implements
46514669
sum += parseInt(col.calcWidth, 10);
46524670
}
46534671
}
4654-
sum += this.featureColumnsWidth();
4672+
if (this.pinning.columns === ColumnPinningPosition.Start) {
4673+
sum += this.featureColumnsWidth();
4674+
}
46554675

46564676
return sum;
46574677
}
@@ -4668,6 +4688,10 @@ export class IgxGridBaseDirective extends DisplayDensityBase implements
46684688
if (this.hasVerticalSroll() && !this.isPercentWidth) {
46694689
width -= this.scrollWidth;
46704690
}
4691+
if (this.pinning.columns === ColumnPinningPosition.End) {
4692+
width -= this.featureColumnsWidth();
4693+
}
4694+
46714695
return width - this.getPinnedWidth(takeHidden);
46724696
}
46734697

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@
188188
</div>
189189

190190
<div class="igx-grid__scroll" [style.height]="'18px'" #scr [hidden]="isHorizontalScrollHidden">
191-
<div class="igx-grid__scroll-start" [style.width.px]='pinnedWidth' [style.min-width.px]='pinnedWidth' [hidden]="pinnedWidth === 0 || !isPinningToStart"></div>
191+
<div class="igx-grid__scroll-start" [style.width.px]='isPinningToStart ? pinnedWidth : headerFeaturesWidth' [style.min-width.px]='isPinningToStart ? pinnedWidth : headerFeaturesWidth'></div>
192192
<div class="igx-grid__scroll-main" [style.width.px]='unpinnedWidth'>
193193
<ng-template igxGridFor [igxGridForOf]='[]' #scrollContainer>
194194
</ng-template>

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

+29
Original file line numberDiff line numberDiff line change
@@ -460,6 +460,35 @@ describe('IgxGrid - Column Pinning to End', () => {
460460
expect(grid.pinnedWidth).toEqual(400);
461461
expect(grid.unpinnedWidth + grid.scrollWidth).toEqual(400);
462462
}));
463+
464+
it('should correctly pin column to right when row selectors are enabled.', fakeAsync(() => {
465+
const fix = TestBed.createComponent(GridRightPinningComponent);
466+
467+
tick();
468+
fix.detectChanges();
469+
const grid = fix.componentInstance.instance;
470+
grid.rowSelectable = true;
471+
tick();
472+
fix.detectChanges();
473+
474+
// check row DOM
475+
const row = grid.getRowByIndex(0).nativeElement;
476+
expect(row.children[0].className).toBe('igx-grid__cbx-selection');
477+
expect(row.children[1].className).toBe('igx-display-container');
478+
expect(row.children[2].getAttribute('aria-describedby')).toBe(grid.id + '_CompanyName');
479+
expect(row.children[3].getAttribute('aria-describedby')).toBe(grid.id + '_ContactName');
480+
481+
// check scrollbar DOM
482+
const scrBarStartSection = fix.debugElement.query(By.css('.igx-grid__scroll-start'));
483+
const scrBarMainSection = fix.debugElement.query(By.css('.igx-grid__scroll-main'));
484+
const scrBarEndSection = fix.debugElement.query(By.css('.igx-grid__scroll-end'));
485+
486+
expect(scrBarStartSection.nativeElement.offsetWidth).toEqual(grid.featureColumnsWidth());
487+
const pinnedColSum = grid.pinnedColumns.map(x => parseInt(x.calcWidth, 10)).reduce((x, y) => x + y);
488+
expect(scrBarEndSection.nativeElement.offsetWidth).toEqual(pinnedColSum);
489+
const expectedUnpinAreWidth = parseInt(grid.width, 10) - grid.featureColumnsWidth() - pinnedColSum - grid.scrollWidth;
490+
expect(scrBarMainSection.nativeElement.offsetWidth).toEqual(expectedUnpinAreWidth);
491+
}));
463492
});
464493

465494
/* tslint:disable */

src/app/grid-column-pinning/grid-column-pinning.sample.html

+4-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
</app-page-header>
55
<div class="sample-content">
66
<div class="sample-column">
7-
<igx-grid [pinning]="pinningConfig" #grid1 [data]="data" [width]="'800px'" [height]="'800px'" [rowSelectable]="true">
7+
<igx-grid [pinning]="pinningConfig" #grid1 [data]="data" [width]="'800px'" [height]="'800px'" [rowSelectable]="false">
88
<igx-column *ngFor="let c of columns" [sortable]="true" [field]="c.field" [header]="c.field" [width]="c.width" [pinned]='c.pinned'
99
[hidden]='c.hidden'>
1010
</igx-column>
@@ -23,6 +23,9 @@
2323
<div class="sample-switches">
2424
<igx-switch [(ngModel)]="grid1.showToolbar">Toolbar</igx-switch>
2525
<igx-switch [(ngModel)]="grid1.columnPinning" style="padding-left: 10px">Column Pinning</igx-switch>
26+
<igx-switch [(ngModel)]="grid1.rowSelectable" style="padding-left: 10px">Row Selectors</igx-switch>
27+
<igx-switch (change)='onChange()' style="padding-left: 10px">Left Pinning toggle</igx-switch>
28+
2629
</div>
2730
</div>
2831
</div>

src/app/grid-column-pinning/grid-column-pinning.sample.ts

+8-1
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,19 @@ import { IPinningConfig } from 'projects/igniteui-angular/src/lib/grids/common/g
1010
})
1111

1212
export class GridColumnPinningSampleComponent implements OnInit {
13-
1413
public pinningConfig: IPinningConfig = { columns: ColumnPinningPosition.End };
1514

1615
@ViewChild('grid1', { static: true })
1716
grid1: IgxGridComponent;
1817

18+
onChange() {
19+
if (this.pinningConfig.columns === ColumnPinningPosition.End) {
20+
this.pinningConfig = { columns: ColumnPinningPosition.Start };
21+
} else {
22+
this.pinningConfig = { columns: ColumnPinningPosition.End };
23+
}
24+
}
25+
1926
data: any[];
2027
columns: any[];
2128

0 commit comments

Comments
 (0)