Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 48 additions & 1 deletion projects/igniteui-angular/grids/grid/src/column.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,8 @@ describe('IgxGrid - Column properties #grid', () => {
TemplatedContextInputColumnsComponent,
ColumnHaederClassesComponent,
ResizableColumnsComponent,
DOMAttributesAsSettersComponent
DOMAttributesAsSettersComponent,
GridInToggleableWrapperComponent
]
}).compileComponents();
}));
Expand Down Expand Up @@ -325,6 +326,29 @@ describe('IgxGrid - Column properties #grid', () => {
expect(grid.columnList.get(1).width).toBe('300px');
});

it('should not derive a NaN column width when the grid is hidden through its wrapper and all columns are sized', () => {
const fix = TestBed.createComponent(GridInToggleableWrapperComponent);
fix.detectChanges();

const grid = fix.componentInstance.grid;

// Hide the grid through its wrapper (display: none) and force a size recalculation.
// With no width set, the hidden grid falls back to summing its column widths for
// calcWidth, so computedWidth equals sumExistingWidths while columnsToSize is 0.
fix.componentInstance.wrapperHidden = true;
fix.detectChanges();
grid.reflow();
fix.detectChanges();

const possibleWidth = grid.getPossibleColumnWidth();
expect(possibleWidth).not.toContain('NaN');
expect(Number.isFinite(parseFloat(possibleWidth))).toBe(true);

// the minWidth column must keep a valid, finite pixel width rather than being poisoned by NaN
const minWidthColumn = grid.getColumnByName('field15');
expect(Number.isFinite(minWidthColumn.calcPixelWidth)).toBe(true);
});

it('should support passing templates through the markup as an input property', () => {
const fixture = TestBed.createComponent(TemplatedInputColumnsComponent);
fixture.detectChanges();
Expand Down Expand Up @@ -1943,6 +1967,29 @@ export class DOMAttributesAsSettersComponent {
public data = [{ id: 1, value: 1 }];
}

@Component({
template: `
<div [style.display]="wrapperHidden ? 'none' : 'block'" style="width: 500px; height: 400px;">
<igx-grid #grid [data]="data" height="400px">
<igx-column field="id" dataType="number" width="1000px"></igx-column>
<igx-column field="field15" dataType="string" minWidth="150px"></igx-column>
</igx-grid>
</div>
`,
changeDetection: ChangeDetectionStrategy.Eager,
imports: [IgxGridComponent, IgxColumnComponent]
})
export class GridInToggleableWrapperComponent {
@ViewChild('grid', { read: IgxGridComponent, static: true })
public grid: IgxGridComponent;

public wrapperHidden = false;
public data = [
{ id: 1, field15: 'lorem' },
{ id: 2, field15: 'ipsum' }
];
}

describe('IgxGrid column autosizing in zoneless change detection #grid', () => {
beforeEach(() => {
TestBed.configureTestingModule({
Expand Down
10 changes: 10 additions & 0 deletions projects/igniteui-angular/grids/grid/src/grid-base.directive.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5636,6 +5636,16 @@ export abstract class IgxGridBaseDirective implements GridType,
return '0px';
}

// When the grid has no measurable width, calculateGridWidth() falls back to the
// sum of its column widths and sets isColumnWidthSum. If all visible columns
// already have explicit or constrained widths, columnsToSize is 0 and
// computedWidth equals sumExistingWidths, resulting in 0 / 0 = NaN.
// Return the "0px" sentinel so _derivePossibleWidth() preserves the existing
// valid column widths.
if (columnsToSize <= 0 && this.isColumnWidthSum) {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bit late & likely not an that much of an issue since the measures probably run again (possibly even more than once 🥲) when the grid is shown, but I remember there was some min (136px?) assigned for columns by default.
In case that'll spare parts of next ops, might consider returning that min instead of 0, with the hope that in a the future where we've reduced the calculations, the column is more likely to settle on the min instead. I see 0 is already used for another case as well, so this fix is fine, just food for thought :)

return '0px';
Comment thread
viktorkombov marked this conversation as resolved.
}

computedWidth -= this.featureColumnsWidth();

const columnWidth = !Number.isFinite(sumExistingWidths) ?
Expand Down
Loading