diff --git a/projects/igniteui-angular/src/lib/grids/grid-base.component.ts b/projects/igniteui-angular/src/lib/grids/grid-base.component.ts index 358c2cc8363..d9e8bc099f6 100644 --- a/projects/igniteui-angular/src/lib/grids/grid-base.component.ts +++ b/projects/igniteui-angular/src/lib/grids/grid-base.component.ts @@ -258,6 +258,7 @@ export abstract class IgxGridBaseComponent extends DisplayDensityBase implements private _observer: MutationObserver; protected _destroyed = false; private overlayIDs = []; + private _hostWidth; /** * An accessor that sets the resource strings. * By default it uses EN resources. @@ -648,6 +649,13 @@ export abstract class IgxGridBaseComponent extends DisplayDensityBase implements } } + /** + * @hidden + */ + @HostBinding('style.width') + get hostWidth() { + return this._width || this._hostWidth; + } /** * Returns the width of the `IgxGridComponent`. * ```typescript @@ -656,7 +664,6 @@ export abstract class IgxGridBaseComponent extends DisplayDensityBase implements * @memberof IgxGridBaseComponent */ @WatchChanges() - @HostBinding('style.width') @Input() get width() { return this._width; @@ -3058,6 +3065,11 @@ export abstract class IgxGridBaseComponent extends DisplayDensityBase implements return this._unpinnedWidth; } + get isHorizontalScrollHidden() { + const diff = this.unpinnedWidth - this.totalWidth; + return this.width === null || diff >= 0; + } + /** * @hidden * Gets the combined width of the columns that are specific to the enabled grid features. They are fixed. @@ -4020,7 +4032,7 @@ export abstract class IgxGridBaseComponent extends DisplayDensityBase implements */ protected _derivePossibleWidth() { if (!this.columnWidthSetByUser) { - this._columnWidth = this.getPossibleColumnWidth(); + this._columnWidth = this.width !== null ? this.getPossibleColumnWidth() : MINIMUM_COLUMN_WIDTH + 'px'; this.columnList.forEach((column: IgxColumnComponent) => { if (this.hasColumnLayouts && parseInt(this._columnWidth, 10)) { const columnWidthCombined = parseInt(this._columnWidth, 10) * (column.colEnd ? column.colEnd - column.colStart : 1); @@ -4175,9 +4187,7 @@ export abstract class IgxGridBaseComponent extends DisplayDensityBase implements parseInt(this.document.defaultView.getComputedStyle(this.nativeElement).getPropertyValue('width'), 10); } - if (this.showRowCheckboxes) { - computedWidth -= this.headerCheckboxContainer ? this.headerCheckboxContainer.nativeElement.offsetWidth : 0; - } + computedWidth -= this.getFeatureColumnsWidth(); const visibleChildColumns = this.visibleColumns.filter(c => !c.columnGroup); @@ -4237,20 +4247,39 @@ export abstract class IgxGridBaseComponent extends DisplayDensityBase implements } - if (!width) { - width = this.columnList.reduce((sum, item) => sum + parseInt((item.width || item.defaultWidth), 10), 0); + if (this.width === null || !width) { + width = this.getColumnWidthSum(); } - if (this.hasVerticalSroll()) { + if (this.hasVerticalSroll() && this.width !== null) { width -= this.scrollWidth; } - if (Number.isFinite(width) && width !== this.calcWidth) { + if ((Number.isFinite(width) || width === null) && width !== this.calcWidth) { this.calcWidth = width; this.cdr.detectChanges(); } this._derivePossibleWidth(); } + private getColumnWidthSum(): number { + let colSum = 0; + const cols = this.hasColumnLayouts ? + this.visibleColumns.filter(x => x.columnLayout) : this.visibleColumns.filter(x => !x.columnGroup); + cols.forEach((item) => { + const isWidthInPercent = item.width && typeof item.width === 'string' && item.width.indexOf('%') !== -1; + if (isWidthInPercent) { + item.width = MINIMUM_COLUMN_WIDTH + 'px'; + } + colSum += parseInt((item.width || item.defaultWidth), 10) || MINIMUM_COLUMN_WIDTH; + }); + if (!colSum) { + return null; + } + this.cdr.detectChanges(); + colSum += this.getFeatureColumnsWidth(); + return colSum; + } + public hasVerticalSroll() { if (!this._ngAfterViewInitPassed) { return false; } const isScrollable = this.verticalScrollContainer.isScrollable(); @@ -4342,6 +4371,33 @@ export abstract class IgxGridBaseComponent extends DisplayDensityBase implements this.cdr.detectChanges(); this.resetCaches(); } + + if (this.zone.isStable) { + this.zone.run(() => { + this._applyWidthHostBinding(); + this.cdr.detectChanges(); + }); + } else { + this.zone.onStable.pipe(first()).subscribe(() => { + this.zone.run(() => { + this._applyWidthHostBinding(); + }); + }); + } + } + + private _applyWidthHostBinding() { + let width = this._width; + if (width === null) { + let currentWidth = this.calcWidth; + if (this.hasVerticalSroll()) { + currentWidth += this.scrollWidth; + } + width = currentWidth + 'px'; + this.resetCaches(); + } + this._hostWidth = width; + this.cdr.markForCheck(); } /** @@ -4392,7 +4448,7 @@ export abstract class IgxGridBaseComponent extends DisplayDensityBase implements protected getUnpinnedWidth(takeHidden = false) { let width = this.isPercentWidth ? this.calcWidth : - parseInt(this.width, 10); + parseInt(this.width, 10) || parseInt(this.hostWidth, 10) || this.calcWidth; if (this.hasVerticalSroll() && !this.isPercentWidth) { width -= this.scrollWidth; } diff --git a/projects/igniteui-angular/src/lib/grids/grid/grid-filtering-ui.spec.ts b/projects/igniteui-angular/src/lib/grids/grid/grid-filtering-ui.spec.ts index 08633a55b6d..3ba2334a661 100644 --- a/projects/igniteui-angular/src/lib/grids/grid/grid-filtering-ui.spec.ts +++ b/projects/igniteui-angular/src/lib/grids/grid/grid-filtering-ui.spec.ts @@ -3509,7 +3509,7 @@ describe('IgxGrid - Filtering actions - Excel style filtering', () => { fix.detectChanges(); const headers: DebugElement[] = fix.debugElement.queryAll(By.directive(IgxGridHeaderGroupComponent)); - const headerResArea = headers[2].children[0].nativeElement; + const headerResArea = headers[2].children[1].nativeElement; const filterIcon = headerResArea.querySelector('.igx-excel-filter__icon'); filterIcon.click(); diff --git a/projects/igniteui-angular/src/lib/grids/grid/grid.component.html b/projects/igniteui-angular/src/lib/grids/grid/grid.component.html index 30251c86cb2..5a388d122b9 100644 --- a/projects/igniteui-angular/src/lib/grids/grid/grid.component.html +++ b/projects/igniteui-angular/src/lib/grids/grid/grid.component.html @@ -129,7 +129,7 @@
-
+
diff --git a/projects/igniteui-angular/src/lib/grids/grid/grid.component.spec.ts b/projects/igniteui-angular/src/lib/grids/grid/grid.component.spec.ts index 2882a2a2403..f259c55de63 100644 --- a/projects/igniteui-angular/src/lib/grids/grid/grid.component.spec.ts +++ b/projects/igniteui-angular/src/lib/grids/grid/grid.component.spec.ts @@ -1383,6 +1383,22 @@ describe('IgxGrid Component Tests', () => { expect(virtDir.getSizeAt(2)).toEqual(150); }); + + it('should render all columns if grid width is set to null.', async () => { + const fix = TestBed.createComponent(IgxGridDefaultRenderingComponent); + fix.componentInstance.initColumnsRows(5, 30); + const grid = fix.componentInstance.grid; + fix.detectChanges(); + + grid.width = null; + fix.detectChanges(); + await wait(16); + + // grid should render all columns and all should be visible. + const cells = grid.getRowByIndex(0).cells; + expect(cells.length).toBe(30); + expect(parseInt(grid.hostWidth, 10)).toBe(30 * 136); + }); }); describe('IgxGrid - API methods', () => { diff --git a/projects/igniteui-angular/src/lib/grids/grid/row-drag.directive.spec.ts b/projects/igniteui-angular/src/lib/grids/grid/row-drag.directive.spec.ts index b94145bb3f9..6d8678f1dea 100644 --- a/projects/igniteui-angular/src/lib/grids/grid/row-drag.directive.spec.ts +++ b/projects/igniteui-angular/src/lib/grids/grid/row-drag.directive.spec.ts @@ -213,6 +213,7 @@ describe('IgxGrid - Row Drag Tests', () => { })); it('should align horizontal scrollbar with first column when column pinning is disabled', fakeAsync(() => { // has no draggable and selectable rows + grid.width = '400px'; grid.rowSelectable = false; grid.rowDraggable = false; tick(); @@ -248,6 +249,7 @@ describe('IgxGrid - Row Drag Tests', () => { expect(rowSelectRect.right).toBe(horizontalScrollbarRect.left); })); it('should align horizontal scrollbar with first non-pinned column when column pinning is enabled', fakeAsync(() => { + grid.width = '400px'; grid.pinColumn('ProductName'); tick(); fixture.detectChanges(); diff --git a/projects/igniteui-angular/src/lib/grids/hierarchical-grid/hierarchical-grid.component.html b/projects/igniteui-angular/src/lib/grids/hierarchical-grid/hierarchical-grid.component.html index 01a58ed8e7b..3ede32d1e01 100644 --- a/projects/igniteui-angular/src/lib/grids/hierarchical-grid/hierarchical-grid.component.html +++ b/projects/igniteui-angular/src/lib/grids/hierarchical-grid/hierarchical-grid.component.html @@ -162,7 +162,7 @@ [style.width.px]="scrollWidth">
-
+
diff --git a/projects/igniteui-angular/src/lib/grids/hierarchical-grid/hierarchical-grid.component.ts b/projects/igniteui-angular/src/lib/grids/hierarchical-grid/hierarchical-grid.component.ts index e6889695596..51e38aac204 100644 --- a/projects/igniteui-angular/src/lib/grids/hierarchical-grid/hierarchical-grid.component.ts +++ b/projects/igniteui-angular/src/lib/grids/hierarchical-grid/hierarchical-grid.component.ts @@ -519,7 +519,7 @@ export class IgxHierarchicalGridComponent extends IgxHierarchicalGridBaseCompone return width; } - private getDefaultExpanderWidth(): number { + private getDefaultExpanderWidth(): number { switch (this.displayDensity) { case DisplayDensity.cosy: return 57; @@ -710,16 +710,6 @@ export class IgxHierarchicalGridComponent extends IgxHierarchicalGridBaseCompone } } - /** - * @hidden - */ - public getPossibleColumnWidth() { - let computedWidth = this.calcWidth || parseInt( - this.document.defaultView.getComputedStyle(this.nativeElement).getPropertyValue('width'), 10); - computedWidth -= this.headerHierarchyExpander.nativeElement.clientWidth; - return super.getPossibleColumnWidth(computedWidth); - } - protected getChildGrids(inDeph?: boolean) { return this.hgridAPI.getChildGrids(inDeph); } diff --git a/projects/igniteui-angular/src/lib/grids/tree-grid/tree-grid.component.html b/projects/igniteui-angular/src/lib/grids/tree-grid/tree-grid.component.html index 01ff7d76fe7..4e7acfd4770 100644 --- a/projects/igniteui-angular/src/lib/grids/tree-grid/tree-grid.component.html +++ b/projects/igniteui-angular/src/lib/grids/tree-grid/tree-grid.component.html @@ -143,7 +143,7 @@ [style.width.px]="scrollWidth">
-
+