Skip to content

Commit 9d2a946

Browse files
authored
fix(grid): Add flex:1 to the display container so that it grows or shrinks to the available width of the grid (#16172)
1 parent 57bbd02 commit 9d2a946

File tree

12 files changed

+55
-38
lines changed

12 files changed

+55
-38
lines changed

projects/igniteui-angular/src/lib/core/styles/components/grid/_grid-theme.scss

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -719,6 +719,9 @@
719719
%grid-display-container-tr {
720720
width: 100%;
721721
overflow: visible;
722+
flex: 1;
723+
// needed to override the min-width of the column headers
724+
min-width: 0;
722725
}
723726

724727
%grid-mrl-block {
@@ -927,7 +930,7 @@
927930
}
928931

929932
padding-block: 0;
930-
flex: 1 0 auto;
933+
flex: 0 0 auto;
931934
background: inherit;
932935
z-index: 4;
933936
cursor: move;

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

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1668,13 +1668,6 @@ export class IgxColumnComponent implements AfterContentInit, OnDestroy, ColumnTy
16681668
return this.pinningPosition === ColumnPinningPosition.End && pinnedCols[0] === this;
16691669
}
16701670

1671-
/** @hidden @internal **/
1672-
public get rightPinnedOffset(): string {
1673-
return this.pinned && this.pinningPosition === ColumnPinningPosition.End ?
1674-
- this.grid.pinnedEndWidth - this.grid.pinnedStartWidth + 'px' :
1675-
null;
1676-
}
1677-
16781671
/** @hidden @internal **/
16791672
public get gridRowSpan(): number {
16801673
return this.rowEnd && this.rowStart ? this.rowEnd - this.rowStart : 1;

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,6 @@
102102
<div class="igx-grid__mrl-block"
103103
[class.igx-grid__td--pinned-last]="col.hasLastPinnedChildColumn"
104104
[class.igx-grid__td--pinned-first]="col.hasFirstPinnedChildColumn"
105-
[style.left]="col.rightPinnedOffset"
106105
[ngStyle]="{
107106
'grid-template-rows':col.getGridTemplate(true),
108107
'grid-template-columns':col.getGridTemplate(false),
@@ -155,7 +154,6 @@
155154
[style.min-width]="col.resolvedWidth"
156155
[style.max-width]="col.resolvedWidth"
157156
[style.flex-basis]="col.resolvedWidth"
158-
[style.left]="col.rightPinnedOffset"
159157
[width]="col.getCellWidth()"
160158
[visibleColumnIndex]="col.visibleIndex"
161159
[value]="data | dataMapper:col.field:grid.pipeTrigger:data[col.field]:col.hasNestedPath"

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ export class IgxGridRowComponent extends IgxRowDirective {
2626
};
2727
}
2828

29-
3029
public getContextMRL(pinnedCols, row) {
3130
return {
3231
$implicit: pinnedCols,

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

Lines changed: 35 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import { IgxGridComponent } from './grid.component';
2828
import { DropPosition } from '../moving/moving.service';
2929
import { clearGridSubs, setupGridScrollDetection } from '../../test-utils/helper-utils.spec';
3030
import { SortingDirection } from '../../data-operations/sorting-strategy';
31-
import { IPinningConfig } from '../public_api';
31+
import { IgxGridHeaderRowComponent, IPinningConfig } from '../public_api';
3232

3333
describe('IgxGrid - Column Pinning #grid', () => {
3434

@@ -134,7 +134,7 @@ describe('IgxGrid - Column Pinning #grid', () => {
134134
expect(GridFunctions.isCellPinned(cell)).toBe(true);
135135
});
136136

137-
it('should allow pinning/unpinning via the column API', () => {
137+
it('should allow pinning/unpinning via the column API', () => {
138138
const col = grid.getColumnByName('ID');
139139

140140
col.pinned = true;
@@ -694,9 +694,14 @@ describe('IgxGrid - Column Pinning #grid', () => {
694694
expect(grid.getColumnByName('CompanyName').isFirstPinned).toBeTruthy();
695695
const row = grid.gridAPI.get_row_by_index(0).nativeElement;
696696
// check cells are rendered after main display container and have left offset
697+
const headerRowDisplayContainer = fix.debugElement.query(By.directive(IgxGridHeaderRowComponent)).nativeElement.querySelector(".igx-display-container");
698+
const displayContainerRect = headerRowDisplayContainer.getBoundingClientRect();
699+
let xAxis = displayContainerRect.x + displayContainerRect.width;
697700
for (let i = 0; i <= pinnedCols.length - 1; i++) {
698701
const elem = row.children[i + 1];
699-
expect(parseInt((elem as any).style.left, 10)).toBe(-330);
702+
const rect = elem.getBoundingClientRect();
703+
expect(rect.x).toBe(xAxis);
704+
xAxis += rect.width;
700705
}
701706

702707
// check correct headers have left border
@@ -715,9 +720,13 @@ describe('IgxGrid - Column Pinning #grid', () => {
715720
const row = grid.gridAPI.get_row_by_index(0).nativeElement;
716721
expect(GridFunctions.getRowDisplayContainer(fix, 0)).toBeTruthy();
717722

723+
const headerRowdisplayContainer = fix.debugElement.query(By.directive(IgxGridHeaderRowComponent)).nativeElement.querySelector(".igx-display-container");
724+
const displayContainerRect = headerRowdisplayContainer.getBoundingClientRect();
725+
const xAxis = displayContainerRect.x + displayContainerRect.width;
726+
718727
expect(row.children[1].classList.contains(`${CELL_PINNED_CLASS}-first`)).toBeTruthy();
719728
expect(row.children[1].classList.contains(GRID_MRL_BLOCK)).toBeTruthy();
720-
expect(parseInt((row.children[1] as any).style.left, 10)).toEqual(-408);
729+
expect(row.children[1].getBoundingClientRect().x).toEqual(xAxis);
721730

722731
// check correct headers have left border
723732
const firstPinnedHeader = grid.headerGroupsList.find(group => group.isPinned);
@@ -854,10 +863,10 @@ describe('IgxGrid - Column Pinning #grid', () => {
854863
expect(grid.unpinnedColumns[1].field).toEqual('ID');
855864
expect(grid.getColumnByName('ID').pinned).toBeFalsy();
856865

857-
// move 'ID' column to the left pinned area, before ContractName
858-
grid.moveColumn(grid.getColumnByName('ID'), grid.getColumnByName('ContactName'), DropPosition.BeforeDropTarget);
859-
tick();
860-
fix.detectChanges();
866+
// move 'ID' column to the left pinned area, before ContractName
867+
grid.moveColumn(grid.getColumnByName('ID'), grid.getColumnByName('ContactName'), DropPosition.BeforeDropTarget);
868+
tick();
869+
fix.detectChanges();
861870

862871
// verify column is pinned at the correct place
863872
expect(grid.pinnedStartColumns[0].field).toEqual('ID');
@@ -887,7 +896,7 @@ describe('IgxGrid - Column Pinning #grid', () => {
887896
expect(cellFax.active).toBe(false);
888897
expect(cellCompanyName.active).toBe(true);
889898

890-
// navigate from left pinned area into unpinned and back
899+
// navigate from left pinned area into unpinned and back
891900
grid.navigation.activeNode = { row: 0, column: 0 };
892901
fix.detectChanges();
893902
expect(grid.getCellByColumn(0, "ContactName").active).toBe(true);
@@ -938,25 +947,33 @@ describe('IgxGrid - Column Pinning #grid', () => {
938947
expect(grid.getColumnByName('Country').isFirstPinned).toBeTruthy();
939948
expect(grid.getColumnByName('ContactTitle').isLastPinned).toBeTruthy();
940949
const row = grid.gridAPI.get_row_by_index(0).nativeElement;
941-
// check pinnedEnd cells are rendered after main display container and have left offset
942-
for (let i = pinnedStart.length ; i <= pinnedStart.length + pinnedEnd.length - 1; i++) {
950+
fix.detectChanges();
951+
// check pinnedEnd cells are rendered after main display container
952+
const displayContainerBoundingBox = row.querySelector('igx-display-container').getBoundingClientRect();
953+
let initialStart = displayContainerBoundingBox.x + displayContainerBoundingBox.width;
954+
for (let i = pinnedStart.length; i <= pinnedStart.length + pinnedEnd.length - 1; i++) {
943955
const elem = row.children[i + 1];
944-
expect(parseFloat((elem as any).style.left)).toBe(- (grid.pinnedEndWidth + grid.pinnedStartWidth));
956+
const rect = elem.getBoundingClientRect();
957+
expect(rect.x).toBe(initialStart);
958+
initialStart += rect.width
945959
}
946960

947-
// check pinnedStart cells are rendered before main display container and have no left offset
948-
for (let i = 0; i <= pinnedStart.length - 1; i++) {
961+
// check pinnedStart cells are rendered before main display container
962+
initialStart = displayContainerBoundingBox.x;
963+
for (let i = pinnedStart.length - 1; i >= 0; i--) {
949964
const elem = row.children[i];
950-
expect((elem as any).style.left).toBe('');
965+
const rect = elem.getBoundingClientRect();
966+
expect(rect.x + rect.width).toBe(initialStart);
967+
initialStart -= rect.width;
951968
}
952969

953970
// check correct headers are pinned and in correct order.
954971
const pinnedHeaders = grid.headerGroupsList.filter(group => group.isPinned);
955972
expect(pinnedHeaders.length).toBe(10);
956973
expect(pinnedHeaders.map(x => x.column.header || x.column.field))
957-
.toEqual(['General Information', 'CompanyName', 'Person Details',
958-
'ContactName', 'ContactTitle', 'Address Information',
959-
'Country', 'Region', 'City', 'Address']);
974+
.toEqual(['General Information', 'CompanyName', 'Person Details',
975+
'ContactName', 'ContactTitle', 'Address Information',
976+
'Country', 'Region', 'City', 'Address']);
960977

961978
});
962979

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,7 @@
9393
<igx-grid-header-group
9494
[ngClass]="column.headerGroupClasses"
9595
[ngStyle]="column.headerGroupStyles |igxHeaderGroupStyle:column:grid.pipeTrigger"
96-
[column]="column"
97-
[style.left]="column.rightPinnedOffset">
96+
[column]="column">
9897
</igx-grid-header-group>
9998
}
10099
}

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -667,6 +667,18 @@ describe('Basic IgxHierarchicalGrid #hGrid', () => {
667667
);
668668
jasmine.getEnv().allowRespy(false);
669669
});
670+
671+
it('should calculate correct column headers width when rowSelection + expand indicators', () => {
672+
hierarchicalGrid.rowSelection = 'multiple';
673+
fixture.detectChanges();
674+
675+
const headerRowElement = hierarchicalGrid.nativeElement.querySelector("igx-grid-header-row");
676+
const headerRowDiv = headerRowElement.querySelector(".igx-grid__tr");
677+
const headerRowChildren = Array.from(headerRowDiv.children);
678+
679+
const elementsWidth = headerRowChildren.reduce((acc,el) => acc+(el as HTMLElement).offsetWidth, 0);
680+
expect(elementsWidth).toEqual((headerRowDiv as HTMLElement).offsetWidth);
681+
});
670682
});
671683

672684
describe('IgxHierarchicalGrid Row Islands #hGrid', () => {

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,6 @@
106106
[style.min-width]="col.resolvedWidth"
107107
[style.max-width]="col.resolvedWidth"
108108
[style.flex-basis]="col.resolvedWidth"
109-
[style.left]="col.rightPinnedOffset"
110109
[width]="col.getCellWidth()"
111110
[visibleColumnIndex]="col.visibleIndex"
112111
[value]="data | dataMapper:col.field:grid.pipeTrigger:data[col.field]:col.hasNestedPath"

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,7 @@
305305
[ngStyle]="column.headerGroupStyles |igxHeaderGroupStyle:column:grid.pipeTrigger" [column]="column"
306306
[style.min-width]="column.resolvedWidth"
307307
[style.flex-basis]="column.resolvedWidth"
308-
[style.left]="column.rightPinnedOffset" (pointerdown)="grid.navigation.focusOutRowHeader($event)">
308+
(pointerdown)="grid.navigation.focusOutRowHeader($event)">
309309
</igx-grid-header-group>
310310
}
311311
}

projects/igniteui-angular/src/lib/grids/summaries/summary-row.component.html

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,7 @@
5555
[style.min-height.px]="minHeight"
5656
[style.min-width]="col.resolvedWidth"
5757
[style.max-width]="col.resolvedWidth"
58-
[style.flex-basis]="col.resolvedWidth"
59-
[style.left]="col.rightPinnedOffset">
58+
[style.flex-basis]="col.resolvedWidth">
6059
</igx-grid-summary-cell>
6160
}
6261
</ng-template>

0 commit comments

Comments
 (0)