Skip to content

Commit 183f055

Browse files
committed
Merge branch 'master' of https://github.com/IgniteUI/igniteui-angular into ddincheva/igxToast
2 parents 279226a + 710523f commit 183f055

File tree

5 files changed

+62
-23
lines changed

5 files changed

+62
-23
lines changed

.github/workflows/nodejs.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ name: Node.js CI
55

66
on:
77
push:
8-
branches: [ master, 9.1.x ]
8+
branches: [ master, 9.1.x, 10.0.x ]
99
pull_request:
10-
branches: [ master, 9.1.x ]
10+
branches: [ master, 9.1.x, 10.0.x ]
1111

1212
jobs:
1313
build:

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@ All notable changes for each version of this project will be documented in this
99
- `IgxSnackbar`
1010
- `message` property has been deprecated. You can use place the message in the snackbar content or pass it as parameter to the show method instead.
1111
- An optional string parameter `message` has been added to `show()` method.
12+
13+
### New Features
14+
- `IgxColumn`
15+
- Added `byHeader` parameter to the `autosize` method which specifies if the autosizing should be based only on the header content width.
16+
1217
## 10.0.0
1318

1419
### General

projects/igniteui-angular/src/lib/directives/for-of/base.helper.component.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export class VirtualHelperBaseDirective implements OnDestroy, AfterViewInit {
2020
public destroyed;
2121

2222
private _afterViewInit = false;
23+
private _scrollNativeSize: number;
2324

2425
ngAfterViewInit() {
2526
this._afterViewInit = true;
@@ -29,7 +30,9 @@ export class VirtualHelperBaseDirective implements OnDestroy, AfterViewInit {
2930
onScroll(event) {
3031
this.scrollAmount = event.target.scrollTop || event.target.scrollLeft;
3132
}
32-
constructor(public elementRef: ElementRef, public cdr: ChangeDetectorRef) { }
33+
constructor(public elementRef: ElementRef, public cdr: ChangeDetectorRef) {
34+
this._scrollNativeSize = this.calculateScrollNativeSize();
35+
}
3336

3437
get nativeElement() {
3538
return this.elementRef.nativeElement;
@@ -54,6 +57,10 @@ export class VirtualHelperBaseDirective implements OnDestroy, AfterViewInit {
5457
}
5558

5659
public get scrollNativeSize() {
60+
return this._scrollNativeSize;
61+
}
62+
63+
public calculateScrollNativeSize() {
5764
const div = document.createElement('div');
5865
const style = div.style;
5966
style.width = '100px';

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)