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 f29aba92704..2e0f4373bc7 100644 --- a/projects/igniteui-angular/src/lib/grids/grid-base.component.ts +++ b/projects/igniteui-angular/src/lib/grids/grid-base.component.ts @@ -248,6 +248,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. @@ -643,6 +644,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 @@ -651,7 +659,6 @@ export abstract class IgxGridBaseComponent extends DisplayDensityBase implements * @memberof IgxGridBaseComponent */ @WatchChanges() - @HostBinding('style.width') @Input() public get width() { return this._width; @@ -3007,6 +3014,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. @@ -3987,7 +3999,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); @@ -4140,9 +4152,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(); if (this.showDragIcons) { computedWidth -= this.headerDragContainer ? this.headerDragContainer.nativeElement.offsetWidth : 0; @@ -4206,20 +4216,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(); @@ -4317,6 +4346,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(); } /** @@ -4367,7 +4423,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 9797b204d79..881a1bfc0b9 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 @@ -3508,7 +3508,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 1c20f3ee2a6..5f9e5d31330 100644 --- a/projects/igniteui-angular/src/lib/grids/grid/grid.component.html +++ b/projects/igniteui-angular/src/lib/grids/grid/grid.component.html @@ -92,7 +92,7 @@