Skip to content

Commit 34d8dbc

Browse files
authored
Merge pull request #7654 from IgniteUI/skrastev/feat-7387
feat(resize): Add byHeader argument to the autosize method.
2 parents fe3a767 + 4a71e6e commit 34d8dbc

File tree

3 files changed

+53
-20
lines changed

3 files changed

+53
-20
lines changed

CHANGELOG.md

+6
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22

33
All notable changes for each version of this project will be documented in this file.
44

5+
## 10.1.0
6+
7+
### New Features
8+
- `IgxColumn`
9+
- Added `byHeader` parameter to the `autosize` method which specifies if the autosizing should be based only on the header content width.
10+
511
## 10.0.0
612

713
### General

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

+37-20
Original file line numberDiff line numberDiff line change
@@ -1750,10 +1750,12 @@ export class IgxColumnComponent implements AfterContentInit {
17501750
* column.autosize();
17511751
* ```
17521752
* @memberof IgxColumnComponent
1753+
* @param byHeader Set if column should be autized based only on the header content
17531754
*/
1754-
public autosize() {
1755+
public autosize(byHeader = false) {
17551756
if (!this.columnGroup) {
1756-
this.width = this.getLargestCellWidth();
1757+
this.width = !byHeader ? this.getLargestCellWidth() :
1758+
(Object.values(this.getHeaderCellWidths()).reduce((a, b) => a + b) + 'px');
17571759
this.grid.reflow();
17581760
}
17591761
}
@@ -1769,6 +1771,36 @@ export class IgxColumnComponent implements AfterContentInit {
17691771
return this._calcWidth;
17701772
}
17711773

1774+
1775+
/**
1776+
* @hidden
1777+
* Returns the width and padding of a header cell.
1778+
*/
1779+
public getHeaderCellWidths() {
1780+
const range = this.grid.document.createRange();
1781+
let headerWidth;
1782+
if (this.headerTemplate && this.headerCell.elementRef.nativeElement.children[0].children.length > 0) {
1783+
headerWidth = Math.max(...Array.from(this.headerCell.elementRef.nativeElement.children[0].children)
1784+
.map((child) => getNodeSizeViaRange(range, child)));
1785+
} else {
1786+
headerWidth = getNodeSizeViaRange(range, this.headerCell.elementRef.nativeElement.children[0]);
1787+
}
1788+
1789+
if (this.sortable || this.filterable) {
1790+
headerWidth += this.headerCell.elementRef.nativeElement.children[1].getBoundingClientRect().width;
1791+
}
1792+
1793+
const headerStyle = this.grid.document.defaultView.getComputedStyle(this.headerCell.elementRef.nativeElement);
1794+
const headerPadding = parseFloat(headerStyle.paddingLeft) + parseFloat(headerStyle.paddingRight) +
1795+
parseFloat(headerStyle.borderRightWidth);
1796+
1797+
// Take into consideration the header group element, since column pinning applies borders to it if its not a columnGroup.
1798+
const headerGroupStyle = this.grid.document.defaultView.getComputedStyle(this.headerGroup.element.nativeElement);
1799+
const borderSize = !this.parent ? parseFloat(headerGroupStyle.borderRightWidth) + parseFloat(headerGroupStyle.borderLeftWidth) : 0;
1800+
1801+
return { width: Math.ceil(headerWidth), padding: Math.ceil(headerPadding + borderSize)};
1802+
}
1803+
17721804
/**
17731805
* @hidden
17741806
* Returns the size (in pixels) of the longest currently visible cell, including the header cell.
@@ -1795,29 +1827,14 @@ export class IgxColumnComponent implements AfterContentInit {
17951827
const index = cellsContentWidths.indexOf(Math.max(...cellsContentWidths));
17961828
const cellStyle = this.grid.document.defaultView.getComputedStyle(this.cells[index].nativeElement);
17971829
const cellPadding = parseFloat(cellStyle.paddingLeft) + parseFloat(cellStyle.paddingRight) +
1798-
parseFloat(cellStyle.borderRightWidth);
1830+
parseFloat(cellStyle.borderLeftWidth) + parseFloat(cellStyle.borderRightWidth);
17991831

18001832
largest.set(Math.max(...cellsContentWidths), cellPadding);
18011833
}
18021834

18031835
if (this.headerCell) {
1804-
let headerCell;
1805-
if (this.headerTemplate && this.headerCell.elementRef.nativeElement.children[0].children.length > 0) {
1806-
headerCell = Math.max(...Array.from(this.headerCell.elementRef.nativeElement.children[0].children)
1807-
.map((child) => getNodeSizeViaRange(range, child)));
1808-
} else {
1809-
headerCell = getNodeSizeViaRange(range, this.headerCell.elementRef.nativeElement.children[0]);
1810-
}
1811-
1812-
if (this.sortable || this.filterable) {
1813-
headerCell += this.headerCell.elementRef.nativeElement.children[1].getBoundingClientRect().width;
1814-
}
1815-
1816-
const headerStyle = this.grid.document.defaultView.getComputedStyle(this.headerCell.elementRef.nativeElement);
1817-
const headerPadding = parseFloat(headerStyle.paddingLeft) + parseFloat(headerStyle.paddingRight) +
1818-
parseFloat(headerStyle.borderRightWidth);
1819-
largest.set(headerCell, headerPadding);
1820-
1836+
const headerCellWidths = this.getHeaderCellWidths();
1837+
largest.set(headerCellWidths.width, headerCellWidths.padding);
18211838
}
18221839

18231840
const largestCell = Math.max(...Array.from(largest.keys()));

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

+10
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,16 @@ describe('IgxGrid - Deferred Column Resizing #grid', () => {
383383
expect(column.width).toEqual('63px');
384384
}));
385385

386+
it('should autosize column programmatically based only on header.', fakeAsync(() => {
387+
const column = fixture.componentInstance.grid.columnList.filter(c => c.field === 'ReleaseDate')[0];
388+
expect(column.width).toEqual('100px');
389+
390+
column.autosize(true);
391+
fixture.detectChanges();
392+
393+
expect(column.width).toEqual('112px');
394+
}));
395+
386396
it('should autosize pinned column programmatically.', fakeAsync(/** height/width setter rAF */() => {
387397
const column = grid.getColumnByName('Released');
388398
expect(column.width).toEqual('100px');

0 commit comments

Comments
 (0)