Skip to content

Commit 55e429a

Browse files
committed
fix(column): use minWidth when sizing columns
1 parent 083ad44 commit 55e429a

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
@@ -1011,6 +1011,7 @@ export class IgxColumnComponent implements AfterContentInit, OnDestroy, ColumnTy
10111011
return;
10121012
}
10131013
this._defaultMinWidth = value;
1014+
this.minWidthSetByUser = true;
10141015
this.grid.notifyChanges(true);
10151016
}
10161017
public get minWidth(): string {
@@ -1863,6 +1864,10 @@ export class IgxColumnComponent implements AfterContentInit, OnDestroy, ColumnTy
18631864
* @hidden
18641865
*/
18651866
protected _maxWidth;
1867+
/**
1868+
* @hidden
1869+
*/
1870+
protected _minWidthSetByUser = false;
18661871
/**
18671872
* @hidden
18681873
*/
@@ -2148,7 +2153,8 @@ export class IgxColumnComponent implements AfterContentInit, OnDestroy, ColumnTy
21482153
if (size && !!size.width) {
21492154
result.push(size.width + 'px');
21502155
} else {
2151-
const currentWidth = parseFloat(this.grid.getPossibleColumnWidth());
2156+
const possibleWidth = this.getPossibeWidth();
2157+
const currentWidth = parseFloat(possibleWidth);
21522158
result.push((this.getConstrainedSizePx(currentWidth)) + 'px');
21532159
}
21542160
}
@@ -2643,7 +2649,8 @@ export class IgxColumnComponent implements AfterContentInit, OnDestroy, ColumnTy
26432649
this._calcWidth = this.grid.calcWidth ? this.getConstrainedSizePx(currentCalcWidth) : 0;
26442650
} else if (!colWidth || isAutoWidth && !this.autoSize) {
26452651
// no width
2646-
const currentCalcWidth = this.defaultWidth || this.grid.getPossibleColumnWidth();
2652+
const possibleWidth = this.getPossibeWidth();
2653+
const currentCalcWidth = this.defaultWidth || possibleWidth;
26472654
this._calcWidth = this.getConstrainedSizePx(currentCalcWidth);
26482655
} else {
26492656
const currentCalcWidth = parseFloat(this.width);
@@ -2698,4 +2705,26 @@ export class IgxColumnComponent implements AfterContentInit, OnDestroy, ColumnTy
26982705
this._applySelectableClass = value;
26992706
}
27002707
}
2708+
2709+
/**
2710+
* @hidden
2711+
*/
2712+
public set minWidthSetByUser(value: boolean) {
2713+
this._minWidthSetByUser = value;
2714+
}
2715+
2716+
/**
2717+
* @hidden
2718+
*/
2719+
public get minWidthSetByUser(): boolean {
2720+
return this._minWidthSetByUser;
2721+
}
2722+
2723+
private getPossibeWidth(): string {
2724+
const possibleWidth = this.grid.getPossibleColumnWidth();
2725+
if (!this.minWidthSetByUser && parseFloat(possibleWidth) < this.grid.minColumnWidth) {
2726+
return this.grid.minColumnWidth + 'px';
2727+
}
2728+
return possibleWidth;
2729+
}
27012730
}

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

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

32063206
private _hostWidth;
3207+
private _possibleColumnWidth: string;
32073208
private _advancedFilteringOverlayId: string;
32083209
private _advancedFilteringPositionSettings: PositionSettings = {
32093210
verticalDirection: VerticalAlignment.Middle,
@@ -5501,8 +5502,8 @@ export abstract class IgxGridBaseDirective implements GridType,
55015502
computedWidth -= this.featureColumnsWidth();
55025503

55035504
const columnWidth = !Number.isFinite(sumExistingWidths) ?
5504-
Math.max(computedWidth / columnsToSize, this.minColumnWidth) :
5505-
Math.max((computedWidth - sumExistingWidths) / columnsToSize, this.minColumnWidth);
5505+
Math.max(computedWidth / columnsToSize, this.defaultHeaderGroupMinWidth) :
5506+
Math.max((computedWidth - sumExistingWidths) / columnsToSize, this.defaultHeaderGroupMinWidth);
55065507

55075508
return columnWidth + 'px';
55085509
}
@@ -6586,9 +6587,10 @@ export abstract class IgxGridBaseDirective implements GridType,
65866587
*/
65876588
protected _derivePossibleWidth() {
65886589
if (!this.columnWidthSetByUser) {
6589-
this._columnWidth = this.width !== null ? this.getPossibleColumnWidth() : this.minColumnWidth + 'px';
6590+
this._possibleColumnWidth = this._columnWidth = this.width !== null ? this.getPossibleColumnWidth() : this.minColumnWidth + 'px';
65906591
}
65916592
this._columns.forEach((column: IgxColumnComponent) => {
6593+
this.setPossibleMinColumnWidth(column);
65926594
if (this.hasColumnLayouts && parseFloat(this._columnWidth)) {
65936595
const columnWidthCombined = parseFloat(this._columnWidth) * (column.colEnd ? column.colEnd - column.colStart : 1);
65946596
column.defaultWidth = columnWidthCombined + 'px';
@@ -7975,4 +7977,16 @@ export abstract class IgxGridBaseDirective implements GridType,
79757977
}
79767978
this._rowCount += 1; // include header row
79777979
}
7980+
7981+
private setPossibleMinColumnWidth(column: IgxColumnComponent): void {
7982+
if (this.columnWidthSetByUser || this.width == null) {
7983+
return;
7984+
}
7985+
7986+
if (column.minWidthSetByUser || column.hidden) {
7987+
this._columnWidth = this._possibleColumnWidth;
7988+
} else if (!column.minWidthSetByUser && parseFloat(this._possibleColumnWidth) < this.minColumnWidth) {
7989+
this._columnWidth = this.minColumnWidth + 'px';
7990+
}
7991+
}
79787992
}

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
]
@@ -898,6 +899,18 @@ describe('IgxGrid - Deferred Column Resizing #grid', () => {
898899
expect(headers[headers.length - 1].nativeElement.innerText).toEqual("ReleaseDate");
899900
expect(firstRowCells.length).toEqual(11);
900901
}));
902+
903+
it('should use user-provided `minWidth` as default min column width to size columns - #16057.', fakeAsync(() => {
904+
const fixture = TestBed.createComponent(MinWidthColumnsComponent);
905+
fixture.detectChanges();
906+
907+
const grid = fixture.componentInstance.grid;
908+
909+
expect(grid.columnList.get(0).width).toEqual('130px');
910+
expect(grid.columnList.get(1).width).toEqual('90px');
911+
expect(grid.columnList.get(2).width).toEqual('90px');
912+
expect(grid.columnList.get(3).width).toEqual('90px');
913+
}));
901914
});
902915
});
903916

@@ -985,6 +998,23 @@ export class NullColumnsComponent implements OnInit {
985998
}
986999
}
9871000

1001+
@Component({
1002+
template: GridTemplateStrings.declareGrid(`width="400px" height="200px"`, ``, `<igx-column [field]="'ID'" [width]="'130px'" [resizable]="true"></igx-column>
1003+
<igx-column [field]="'CompanyName'" [minWidth]="'50px'" [resizable]="true"></igx-column>
1004+
<igx-column [field]="'ContactName'" [minWidth]="'50px'" [resizable]="true"></igx-column>
1005+
<igx-column [field]="'ContactTitle'" [minWidth]="'50px'" [resizable]="true"></igx-column>`),
1006+
imports: [IgxGridComponent, IgxColumnComponent]
1007+
})
1008+
export class MinWidthColumnsComponent implements OnInit {
1009+
@ViewChild(IgxGridComponent, { static: true }) public grid: IgxGridComponent;
1010+
1011+
public data = [];
1012+
1013+
public ngOnInit(): void {
1014+
this.data = SampleTestData.contactInfoData();
1015+
}
1016+
}
1017+
9881018
@Component({
9891019
template: GridTemplateStrings.declareGrid(`width="400px" height="600px" [allowFiltering]="true"`, ``, `<igx-column [field]="'Items'" [width]="'40px'" dataType="string" [filterable]="true"></igx-column>
9901020
<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)