Skip to content

Commit e90541f

Browse files
authored
Merge branch 'master' into iganchev/combo-auto-strategy-poc
2 parents 84e6dc0 + 34d8dbc commit e90541f

File tree

3 files changed

+49
-21
lines changed

3 files changed

+49
-21
lines changed

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ All notable changes for each version of this project will be documented in this
99
- **Behavioral Change** - Change default positioning strategy from `ConnectedPositioningStrategy` to `AutoPositionStrategy`. The Auto strategy will initially try to show the element like the Connected strategy does. If the element goes out of the viewport Auto will flip the starting point and the direction, i.e. if the direction is 'bottom', it will switch it to 'top' and so on.
1010

1111
### New Features
12-
12+
- `IgxColumn`
13+
- Added `byHeader` parameter to the `autosize` method which specifies if the autosizing should be based only on the header content width.
1314

1415
## 10.0.0
1516

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

Lines changed: 37 additions & 20 deletions
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

Lines changed: 10 additions & 0 deletions
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)