Skip to content

Commit 32e054f

Browse files
committed
fix(column): use minWidth when sizing columns
1 parent dd5ba17 commit 32e054f

File tree

4 files changed

+85
-6
lines changed

4 files changed

+85
-6
lines changed

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

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1012,6 +1012,7 @@ export class IgxColumnComponent implements AfterContentInit, OnDestroy, ColumnTy
10121012
return;
10131013
}
10141014
this._defaultMinWidth = value;
1015+
this.minWidthSetByUser = true;
10151016
this.grid.notifyChanges(true);
10161017
}
10171018
public get minWidth(): string {
@@ -1864,6 +1865,10 @@ export class IgxColumnComponent implements AfterContentInit, OnDestroy, ColumnTy
18641865
* @hidden
18651866
*/
18661867
protected _maxWidth;
1868+
/**
1869+
* @hidden
1870+
*/
1871+
protected _minWidthSetByUser = false;
18671872
/**
18681873
* @hidden
18691874
*/
@@ -2149,7 +2154,8 @@ export class IgxColumnComponent implements AfterContentInit, OnDestroy, ColumnTy
21492154
if (size && !!size.width) {
21502155
result.push(size.width + 'px');
21512156
} else {
2152-
const currentWidth = parseFloat(this.grid.getPossibleColumnWidth());
2157+
const possibleWidth = this.getPossibeWidth();
2158+
const currentWidth = parseFloat(possibleWidth);
21532159
result.push((this.getConstrainedSizePx(currentWidth)) + 'px');
21542160
}
21552161
}
@@ -2644,7 +2650,8 @@ export class IgxColumnComponent implements AfterContentInit, OnDestroy, ColumnTy
26442650
this._calcWidth = this.grid.calcWidth ? this.getConstrainedSizePx(currentCalcWidth) : 0;
26452651
} else if (!colWidth || isAutoWidth && !this.autoSize) {
26462652
// no width
2647-
const currentCalcWidth = this.defaultWidth || this.grid.getPossibleColumnWidth();
2653+
const possibleWidth = this.getPossibeWidth();
2654+
const currentCalcWidth = this.defaultWidth || possibleWidth;
26482655
this._calcWidth = this.getConstrainedSizePx(currentCalcWidth);
26492656
} else {
26502657
const currentCalcWidth = parseFloat(this.width);
@@ -2699,4 +2706,26 @@ export class IgxColumnComponent implements AfterContentInit, OnDestroy, ColumnTy
26992706
this._applySelectableClass = value;
27002707
}
27012708
}
2709+
2710+
/**
2711+
* @hidden
2712+
*/
2713+
public set minWidthSetByUser(value: boolean) {
2714+
this._minWidthSetByUser = value;
2715+
}
2716+
2717+
/**
2718+
* @hidden
2719+
*/
2720+
public get minWidthSetByUser(): boolean {
2721+
return this._minWidthSetByUser;
2722+
}
2723+
2724+
private getPossibeWidth(): string {
2725+
const possibleWidth = this.grid.getPossibleColumnWidth();
2726+
if (!this.minWidthSetByUser && parseFloat(possibleWidth) < this.grid.minColumnWidth) {
2727+
return this.grid.minColumnWidth + 'px';
2728+
}
2729+
return possibleWidth;
2730+
}
27022731
}

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

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3237,6 +3237,7 @@ export abstract class IgxGridBaseDirective implements GridType,
32373237
private _shouldRecalcRowHeight = false;
32383238

32393239
private _hostWidth;
3240+
private _possibleColumnWidth: string;
32403241
private _advancedFilteringOverlayId: string;
32413242
private _advancedFilteringPositionSettings: PositionSettings = {
32423243
verticalDirection: VerticalAlignment.Middle,
@@ -5534,8 +5535,8 @@ export abstract class IgxGridBaseDirective implements GridType,
55345535
computedWidth -= this.featureColumnsWidth();
55355536

55365537
const columnWidth = !Number.isFinite(sumExistingWidths) ?
5537-
Math.max(computedWidth / columnsToSize, this.minColumnWidth) :
5538-
Math.max((computedWidth - sumExistingWidths) / columnsToSize, this.minColumnWidth);
5538+
Math.max(computedWidth / columnsToSize, this.defaultHeaderGroupMinWidth) :
5539+
Math.max((computedWidth - sumExistingWidths) / columnsToSize, this.defaultHeaderGroupMinWidth);
55395540

55405541
return columnWidth + 'px';
55415542
}
@@ -6619,9 +6620,10 @@ export abstract class IgxGridBaseDirective implements GridType,
66196620
*/
66206621
protected _derivePossibleWidth() {
66216622
if (!this.columnWidthSetByUser) {
6622-
this._columnWidth = this.width !== null ? this.getPossibleColumnWidth() : this.minColumnWidth + 'px';
6623+
this._possibleColumnWidth = this._columnWidth = this.width !== null ? this.getPossibleColumnWidth() : this.minColumnWidth + 'px';
66236624
}
66246625
this._columns.forEach((column: IgxColumnComponent) => {
6626+
this.setPossibleMinColumnWidth(column);
66256627
if (this.hasColumnLayouts && parseFloat(this._columnWidth)) {
66266628
const columnWidthCombined = parseFloat(this._columnWidth) * (column.colEnd ? column.colEnd - column.colStart : 1);
66276629
column.defaultWidth = columnWidthCombined + 'px';
@@ -8008,4 +8010,16 @@ export abstract class IgxGridBaseDirective implements GridType,
80088010
}
80098011
this._rowCount += 1; // include header row
80108012
}
8013+
8014+
private setPossibleMinColumnWidth(column: IgxColumnComponent): void {
8015+
if (this.columnWidthSetByUser || this.width == null) {
8016+
return;
8017+
}
8018+
8019+
if (column.minWidthSetByUser || column.hidden) {
8020+
this._columnWidth = this._possibleColumnWidth;
8021+
} else if (!column.minWidthSetByUser && parseFloat(this._possibleColumnWidth) < this.minColumnWidth) {
8022+
this._columnWidth = this.minColumnWidth + 'px';
8023+
}
8024+
}
80118025
}

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

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ describe('IgxGrid - Deferred Column Resizing #grid', () => {
2929
GridFeaturesComponent,
3030
LargePinnedColGridComponent,
3131
NullColumnsComponent,
32+
MinWidthColumnsComponent,
3233
ColGridComponent,
3334
ColPercentageGridComponent
3435
]
@@ -902,6 +903,18 @@ describe('IgxGrid - Deferred Column Resizing #grid', () => {
902903
expect(headers[headers.length - 1].nativeElement.innerText).toEqual("ReleaseDate");
903904
expect(firstRowCells.length).toEqual(11);
904905
}));
906+
907+
it('should use user-provided `minWidth` as default min column width to size columns - #16057.', fakeAsync(() => {
908+
const fixture = TestBed.createComponent(MinWidthColumnsComponent);
909+
fixture.detectChanges();
910+
911+
const grid = fixture.componentInstance.grid;
912+
913+
expect(grid.columnList.get(0).width).toEqual('80px');
914+
expect(grid.columnList.get(1).width).toEqual('101px');
915+
expect(grid.columnList.get(2).width).toEqual('101px');
916+
expect(grid.columnList.get(3).width).toEqual('101px');
917+
}));
905918
});
906919
});
907920

@@ -989,6 +1002,23 @@ export class NullColumnsComponent implements OnInit {
9891002
}
9901003
}
9911004

1005+
@Component({
1006+
template: GridTemplateStrings.declareGrid(`width="400px" height="200px"`, ``, `<igx-column [field]="'ID'" [width]="'80px'" [resizable]="true"></igx-column>
1007+
<igx-column [field]="'CompanyName'" [minWidth]="'50px'" [resizable]="true"></igx-column>
1008+
<igx-column [field]="'ContactName'" [minWidth]="'50px'" [resizable]="true"></igx-column>
1009+
<igx-column [field]="'ContactTitle'" [minWidth]="'50px'" [resizable]="true"></igx-column>`),
1010+
imports: [IgxGridComponent, IgxColumnComponent]
1011+
})
1012+
export class MinWidthColumnsComponent implements OnInit {
1013+
@ViewChild(IgxGridComponent, { static: true }) public grid: IgxGridComponent;
1014+
1015+
public data = [];
1016+
1017+
public ngOnInit(): void {
1018+
this.data = SampleTestData.contactInfoData();
1019+
}
1020+
}
1021+
9921022
@Component({
9931023
template: GridTemplateStrings.declareGrid(`width="400px" height="600px" [allowFiltering]="true"`, ``, `<igx-column [field]="'Items'" [width]="'40px'" dataType="string" [filterable]="true"></igx-column>
9941024
<igx-column [field]="'ID'" [width]="'50px'" [header]="'ID'" [filterable]="true"></igx-column>

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,13 @@ export abstract class IgxHierarchicalGridBaseDirective extends IgxGridBaseDirect
273273
mirror.inputs.forEach((input) => {
274274
const propName = input.propName;
275275
if (!(col[propName] instanceof IgxSummaryOperand)) {
276-
ref.instance[propName] = col[propName];
276+
if (propName === 'minWidth') {
277+
const minWidthSetByUser = col.minWidthSetByUser;
278+
ref.instance[propName] = col[propName];
279+
ref.instance.minWidthSetByUser = minWidthSetByUser;
280+
} else {
281+
ref.instance[propName] = col[propName];
282+
}
277283
} else {
278284
ref.instance[propName] = col[propName].constructor;
279285
}

0 commit comments

Comments
 (0)