Skip to content

Commit c91283b

Browse files
MKirovaMKirova
authored andcommitted
feat(igxPivot): Add API to auto-size the row dimension header cells based on their content.
1 parent 0fa4333 commit c91283b

File tree

6 files changed

+94
-5
lines changed

6 files changed

+94
-5
lines changed

projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-grid.component.ts

Lines changed: 75 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ import {
2323
ViewContainerRef,
2424
Injector,
2525
NgModuleRef,
26-
ApplicationRef
26+
ApplicationRef,
27+
ContentChildren
2728
} from '@angular/core';
2829
import { IgxGridBaseDirective } from '../grid-base.directive';
2930
import { IgxFilteringService } from '../filtering/grid-filtering.service';
@@ -62,6 +63,8 @@ import { IgxGridTransaction } from '../common/types';
6263
import { SortingDirection } from '../../data-operations/sorting-strategy';
6364
import { GridBaseAPIService } from '../api.service';
6465
import { IgxGridForOfDirective } from '../../directives/for-of/for_of.directive';
66+
import { IgxPivotRowDimensionContentComponent } from './pivot-row-dimension-content.component';
67+
import { flatten } from '@angular/compiler';
6568

6669
let NEXT_ID = 0;
6770
const MINIMUM_COLUMN_WIDTH = 200;
@@ -993,6 +996,75 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
993996
super.setupColumns();
994997
}
995998

999+
/**
1000+
* Auto-sizes row dimension cells.
1001+
*
1002+
* @remarks
1003+
* Only sizes based on the dimension cells in view.
1004+
* @example
1005+
* ```typescript
1006+
* this.grid.autoSizeRowDimension(dimension);
1007+
* ```
1008+
* @param dimension The row dimension to size.
1009+
*/
1010+
public autoSizeRowDimension(dimension: IPivotDimension) {
1011+
if (this.getDimensionType(dimension) === PivotDimensionType.Row) {
1012+
const relatedDims = PivotUtil.flatten([dimension]).map(x => x.memberName);
1013+
const content = this.rowDimensionContentCollection.filter(x => relatedDims.indexOf(x.dimension.memberName) !== -1);
1014+
const headers = flatten(content.map(x => x.headerGroups.toArray())).map(x => x.header.refInstance);
1015+
const autoWidth = this.getLargesContentWidth(headers);
1016+
dimension.width = autoWidth;
1017+
this.pipeTrigger++;
1018+
}
1019+
}
1020+
1021+
@ViewChildren(IgxPivotRowDimensionContentComponent)
1022+
protected rowDimensionContentCollection: QueryList<IgxPivotRowDimensionContentComponent>;
1023+
1024+
protected getElementContentWidth(element: HTMLElement): any {
1025+
const range = this.document.createRange();
1026+
const headerWidth = this.platform.getNodeSizeViaRange(range,
1027+
element,
1028+
element.parentElement);
1029+
1030+
const headerStyle = this.document.defaultView.getComputedStyle(element);
1031+
const headerPadding = parseFloat(headerStyle.paddingLeft) + parseFloat(headerStyle.paddingRight) +
1032+
parseFloat(headerStyle.borderRightWidth);
1033+
1034+
return { width: Math.ceil(headerWidth), padding: Math.ceil(headerPadding) };
1035+
}
1036+
1037+
protected getDimensionType(dimension: IPivotDimension): PivotDimensionType {
1038+
return PivotUtil.flatten(this.rowDimensions).indexOf(dimension) !== -1 ? PivotDimensionType.Row :
1039+
PivotUtil.flatten(this.columnDimensions).indexOf(dimension) !== -1 ? PivotDimensionType.Column : PivotDimensionType.Filter;
1040+
}
1041+
1042+
protected getLargesContentWidth(contents: ElementRef[]): string {
1043+
const range = this.document.createRange();
1044+
const largest = new Map<number, number>();
1045+
1046+
if (contents.length > 0) {
1047+
const cellsContentWidths = [];
1048+
contents.forEach((elem) => cellsContentWidths.push(this.getElementContentWidth(elem.nativeElement).width));
1049+
1050+
const index = cellsContentWidths.indexOf(Math.max(...cellsContentWidths));
1051+
const cellStyle = this.document.defaultView.getComputedStyle(contents[index].nativeElement);
1052+
const cellPadding = parseFloat(cellStyle.paddingLeft) + parseFloat(cellStyle.paddingRight) +
1053+
parseFloat(cellStyle.borderLeftWidth) + parseFloat(cellStyle.borderRightWidth);
1054+
1055+
largest.set(Math.max(...cellsContentWidths), cellPadding);
1056+
}
1057+
1058+
const largestCell = Math.max(...Array.from(largest.keys()));
1059+
const width = Math.ceil(largestCell + largest.get(largestCell));
1060+
1061+
if (Number.isNaN(width)) {
1062+
return null;
1063+
} else {
1064+
return width + 'px';
1065+
}
1066+
}
1067+
9961068
protected resolveToggle(groupColumn: IgxColumnComponent, state: boolean) {
9971069
groupColumn.hidden = state;
9981070
this.columnGroupStates.set(groupColumn.field, state);
@@ -1042,12 +1114,12 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
10421114
/**
10431115
* @hidden @internal
10441116
*/
1045-
@ViewChildren('verticalRowDimScrollContainer', { read: IgxGridForOfDirective})
1117+
@ViewChildren('verticalRowDimScrollContainer', { read: IgxGridForOfDirective })
10461118
public verticalRowDimScrollContainers: QueryList<IgxGridForOfDirective<any>>;
10471119

10481120
protected verticalScrollHandler(event) {
10491121
super.verticalScrollHandler(event);
1050-
this.verticalRowDimScrollContainers.forEach(x => {
1122+
this.verticalRowDimScrollContainers.forEach(x => {
10511123
x.onScroll(event);
10521124
x.cdr.detectChanges();
10531125
});

projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-row-dimension-content.component.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,15 @@ import {
33
ChangeDetectorRef,
44
Component,
55
ComponentFactoryResolver,
6+
ContentChildren,
67
ElementRef,
78
Inject,
89
Input,
10+
QueryList,
911
SimpleChanges,
1012
TemplateRef,
1113
ViewChild,
14+
ViewChildren,
1215
ViewContainerRef
1316
} from '@angular/core';
1417
import { IgxColumnGroupComponent } from '../columns/column-group.component';
@@ -18,6 +21,7 @@ import { IGX_GRID_BASE, PivotGridType } from '../common/grid.interface';
1821
import { IgxGridHeaderRowComponent } from '../headers/grid-header-row.component';
1922
import { IgxRowDirective } from '../row.directive';
2023
import { IPivotDimension, IPivotDimensionData } from './pivot-grid.interface';
24+
import { IgxPivotRowDimensionHeaderGroupComponent } from './pivot-row-dimension-header-group.component';
2125
import { PivotUtil } from './pivot-util';
2226

2327
/**
@@ -59,6 +63,9 @@ export class IgxPivotRowDimensionContentComponent extends IgxGridHeaderRowCompon
5963
@ViewChild('headerDefaultTemplate', { read: TemplateRef, static: true })
6064
public headerTemplateDefault: TemplateRef<any>;
6165

66+
@ViewChildren(IgxPivotRowDimensionHeaderGroupComponent)
67+
public headerGroups: QueryList<IgxPivotRowDimensionHeaderGroupComponent>
68+
6269
constructor(
6370
@Inject(IGX_GRID_BASE) public grid: PivotGridType,
6471
protected ref: ElementRef<HTMLElement>,

projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-row-dimension-header-group.component.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, HostBinding, HostListener, Inject, Input } from '@angular/core';
1+
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, HostBinding, HostListener, Inject, Input, ViewChild, ViewChildren } from '@angular/core';
22
import { PlatformUtil } from '../../core/utils';
33
import { IgxColumnComponent } from '../columns/column.component';
44
import { IGX_GRID_BASE, PivotGridType } from '../common/grid.interface';
@@ -7,6 +7,7 @@ import { IgxGridHeaderGroupComponent } from '../headers/grid-header-group.compon
77
import { IgxColumnResizingService } from '../resizing/resizing.service';
88
import { IgxRowDirective } from '../row.directive';
99
import { IPivotDimension } from './pivot-grid.interface';
10+
import { IgxPivotRowDimensionHeaderComponent } from './pivot-row-dimension-header.component';
1011

1112
/**
1213
* @hidden
@@ -41,6 +42,9 @@ export class IgxPivotRowDimensionHeaderGroupComponent extends IgxGridHeaderGroup
4142
@Input()
4243
public parent: any;
4344

45+
@ViewChild(IgxPivotRowDimensionHeaderComponent)
46+
public header: IgxPivotRowDimensionHeaderComponent;
47+
4448
@HostBinding('attr.id')
4549
public get headerID() {
4650
return `${this.grid.id}_-2_${this.rowIndex}_${this.visibleIndex}`;

projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-row-dimension-header.component.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export class IgxPivotRowDimensionHeaderComponent extends IgxGridHeaderComponent
1919
@Inject(IGX_GRID_BASE) public grid: GridType,
2020
public colResizingService: IgxColumnResizingService,
2121
public cdr: ChangeDetectorRef,
22-
private refInstance: ElementRef<HTMLElement>
22+
public refInstance: ElementRef<HTMLElement>
2323
) {
2424
super(grid, colResizingService, cdr, refInstance);
2525
}

src/app/pivot-grid/pivot-grid.sample.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
<button igxButton [disabled]="grid1.displayDensity === compact" (click)="setDensity('compact')">Compact</button>
1111
</igx-buttongroup>
1212
</div>
13+
<button (click)='autoSizeRow(0)'>AutoSize Row 0</button>
14+
<button (click)='autoSizeRow(1)'>AutoSize Row 1</button>
1315
</div>
1416

1517
<igx-pivot-grid #grid1 [data]="origData" [width]="'100%'" [height]="'100%'" [defaultExpandState]='true'

src/app/pivot-grid/pivot-grid.sample.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,4 +222,8 @@ export class PivotGridSampleComponent {
222222
public setDensity(density: DisplayDensity) {
223223
this.grid1.displayDensity = density;
224224
}
225+
226+
public autoSizeRow(ind) {
227+
this.grid1.autoSizeRowDimension(this.pivotConfigHierarchy.rows[ind]);
228+
}
225229
}

0 commit comments

Comments
 (0)