Skip to content

Commit a5c8d73

Browse files
committed
Merge branch '20.0.x' into bpachilova/column-headers-a11y-15962
2 parents d7fd748 + 9953ebd commit a5c8d73

File tree

10 files changed

+127
-51
lines changed

10 files changed

+127
-51
lines changed

projects/igniteui-angular/src/lib/core/styles/components/drop-down/_drop-down-theme.scss

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -299,20 +299,16 @@
299299
bottom: 0;
300300
}
301301

302-
igx-icon {
302+
igx-icon,
303+
igc-icon {
303304
justify-content: center;
304-
--component-size: 1;
305-
306-
@if $variant == 'fluent' {
307-
--component-size: 3;
308-
}
309305

310306
@if $variant == 'indigo' {
311307
$icon-size: sizable(rem(14px), rem(16px), rem(16px));
312308

313-
width: var(--ig-icon-size, $icon-size);
314-
height: var(--ig-icon-size, $icon-size);
315-
font-size: var(--ig-icon-size, $icon-size);
309+
--size: #{$icon-size};
310+
} @else {
311+
--component-size: 1;
316312
}
317313
}
318314
}

projects/igniteui-angular/src/lib/grids/grid-base.directive.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6166,7 +6166,7 @@ export abstract class IgxGridBaseDirective implements GridType,
61666166
* @hidden @internal
61676167
*/
61686168
public trackColumnChanges(_index, col) {
6169-
return col.field + col._calcWidth;
6169+
return col.field + col._calcWidth.toString();
61706170
}
61716171

61726172
/**

projects/igniteui-angular/src/lib/grids/grid/grid-validation.service.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ export class IgxGridValidationService {
3636
owner: this.grid
3737
};
3838
this.grid.formGroupCreated.emit(args);
39+
formGroup.patchValue(data);
3940
this.add(rowId, formGroup);
4041
} else {
4142
// reset to pristine.

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ import { IgxIconComponent } from "../../icon/icon.component";
4747
import { IgxInputGroupComponent } from "../../input-group/input-group.component";
4848
import { fadeIn, fadeOut } from 'igniteui-angular/animations';
4949
import { Size } from '../common/enums';
50+
import { GridColumnDataType } from '../../data-operations/data-util';
5051

5152
interface IDataSelectorPanel {
5253
name: string;
@@ -541,8 +542,13 @@ export class IgxPivotDataSelectorComponent {
541542
* @internal
542543
*/
543544
public onAggregationChange(event: ISelectionEventArgs) {
545+
544546
if (!this.isSelected(event.newSelection.value)) {
545547
this.value.aggregate = event.newSelection.value;
548+
const isSingleValue = this.grid.values.length === 1;
549+
550+
PivotUtil.updateColumnTypeByAggregator(this.grid.columns, this.value, isSingleValue);
551+
546552
this.grid.pipeTrigger++;
547553
this.grid.cdr.markForCheck();
548554
}

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

Lines changed: 38 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,12 @@ import {
3232
} from '@angular/core';
3333
import { NgTemplateOutlet, NgClass, NgStyle } from '@angular/common';
3434

35-
import { first, take, takeUntil} from 'rxjs/operators';
35+
import { first, take, takeUntil } from 'rxjs/operators';
3636
import { IgxGridBaseDirective } from '../grid-base.directive';
3737
import { IgxFilteringService } from '../filtering/grid-filtering.service';
3838
import { IgxGridSelectionService } from '../selection/selection.service';
3939
import { IgxForOfSyncService, IgxForOfScrollSyncService } from '../../directives/for-of/for_of.sync.service';
40-
import { ColumnType, GridType, IGX_GRID_BASE, IGX_GRID_SERVICE_BASE, IgxColumnTemplateContext, RowType } from '../common/grid.interface';
40+
import { ColumnType, GridType, IGX_GRID_BASE, IGX_GRID_SERVICE_BASE, IgxColumnTemplateContext, PivotGridType, RowType } from '../common/grid.interface';
4141
import { IgxGridCRUDService } from '../common/crud.service';
4242
import { IgxGridSummaryService } from '../summaries/grid-summary.service';
4343
import { DEFAULT_PIVOT_KEYS, IDimensionsChange, IgxPivotGridValueTemplateContext, IPivotConfiguration, IPivotConfigurationChangedEventArgs, IPivotDimension, IPivotValue, IValuesChange, PivotDimensionType, IPivotUISettings, PivotRowLayoutType, PivotSummaryPosition } from './pivot-grid.interface';
@@ -72,7 +72,7 @@ import { IgxPivotColumnResizingService } from '../resizing/pivot-grid/pivot-resi
7272
import { IgxFlatTransactionFactory, IgxOverlayService, State, Transaction, TransactionService } from '../../services/public_api';
7373
import { cloneArray, PlatformUtil, resizeObservable } from '../../core/utils';
7474
import { IgxPivotFilteringService } from './pivot-filtering.service';
75-
import { DataUtil } from '../../data-operations/data-util';
75+
import { DataUtil, GridColumnDataType } from '../../data-operations/data-util';
7676
import { IFilteringExpressionsTree } from '../../data-operations/filtering-expressions-tree';
7777
import { IgxGridTransaction } from '../common/types';
7878
import { GridBaseAPIService } from '../api.service';
@@ -199,7 +199,7 @@ const MINIMUM_COLUMN_WIDTH_SUPER_COMPACT = 104;
199199
schemas: [CUSTOM_ELEMENTS_SCHEMA]
200200
})
201201
export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnInit, AfterContentInit,
202-
GridType, AfterViewInit, OnChanges {
202+
PivotGridType, AfterViewInit, OnChanges {
203203

204204
/**
205205
* Emitted when the dimension collection is changed via the grid chip area.
@@ -1672,7 +1672,7 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
16721672
public autoSizeRowDimension(dimension: IPivotDimension) {
16731673
if (this.getDimensionType(dimension) === PivotDimensionType.Row) {
16741674
const relatedDims: string[] = PivotUtil.flatten([dimension]).map((x: IPivotDimension) => x.memberName);
1675-
const contentCollection = this.getContentCollection(dimension);
1675+
const contentCollection = this.getContentCollection(dimension);
16761676
const content = contentCollection.filter(x => relatedDims.indexOf(x.dimension.memberName) !== -1);
16771677
const headers = content.map(x => x.headerGroups.toArray()).flat().map(x => x.header && x.header.refInstance);
16781678
if (this.pivotUI.showRowHeaders) {
@@ -1946,8 +1946,8 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
19461946
*/
19471947
public getRowDimensionByName(memberName: string) {
19481948
const visibleRows = this.pivotUI.rowLayout === PivotRowLayoutType.Vertical ?
1949-
this.pivotConfiguration.rows :
1950-
PivotUtil.flatten(this.pivotConfiguration.rows);
1949+
this.pivotConfiguration.rows :
1950+
PivotUtil.flatten(this.pivotConfiguration.rows);
19511951
const dimIndex = visibleRows.findIndex((target) => target.memberName === memberName);
19521952
const dim = visibleRows[dimIndex];
19531953
return dim;
@@ -2281,7 +2281,7 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
22812281
const separator = this.pivotKeys.columnDimensionSeparator;
22822282
const dataArr = fields.map(x => x.split(separator)).sort(x => x.length);
22832283
const hierarchy = new Map<string, any>();
2284-
const columnDimensions = PivotUtil.flatten(this.columnDimensions);
2284+
const columnDimensions = PivotUtil.flatten(this.columnDimensions);
22852285
dataArr.forEach(arr => {
22862286
let currentHierarchy = hierarchy;
22872287
const path = [];
@@ -2301,17 +2301,22 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
23012301
});
23022302
return hierarchy;
23032303
}
2304-
23052304
protected generateColumnHierarchy(fields: Map<string, any>, data, parent = null): IgxColumnComponent[] {
23062305
let columns = [];
23072306
if (fields.size === 0) {
23082307
this.values.forEach((value) => {
23092308
const ref = createComponent(IgxColumnComponent, { environmentInjector: this.envInjector, elementInjector: this.injector });
2309+
let columnDataType = value.dataType || this.resolveDataTypes(data.length ? data[0][value.member] : null);
2310+
2311+
if (value.aggregate?.key?.toLowerCase() === 'count' && (columnDataType === GridColumnDataType.Currency || columnDataType == GridColumnDataType.Percent)) {
2312+
columnDataType = GridColumnDataType.Number;
2313+
}
2314+
23102315
ref.instance.header = value.displayName;
23112316
ref.instance.field = value.member;
23122317
ref.instance.parent = parent;
23132318
ref.instance.sortable = true;
2314-
ref.instance.dataType = value.dataType || this.resolveDataTypes(data.length ? data[0][value.member] : null);
2319+
ref.instance.dataType = columnDataType;
23152320
ref.instance.formatter = value.formatter;
23162321
columns.push(ref.instance);
23172322
});
@@ -2325,9 +2330,20 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
23252330
}
23262331
if (shouldGenerate && (value.children == null || value.children.length === 0 || value.children.size === 0)) {
23272332
const col = this.createColumnForDimension(value, data, parent, this.hasMultipleValues);
2333+
2334+
if (!this.hasMultipleValues && this.values.length > 0) {
2335+
PivotUtil.updateColumnTypeByAggregator([col], this.values[0], true);
2336+
}
2337+
23282338
columns.push(col);
23292339
if (this.hasMultipleValues) {
23302340
const measureChildren = this.getMeasureChildren(data, col, false, value.dimension.width);
2341+
2342+
measureChildren.forEach((child, index) => {
2343+
const pivotValue = this.values[index];
2344+
PivotUtil.updateColumnTypeByAggregator([child], pivotValue, this.values.length === 1);
2345+
});
2346+
23312347
col.children.reset(measureChildren);
23322348
columns = columns.concat(measureChildren);
23332349
}
@@ -2397,20 +2413,20 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
23972413
};
23982414
values.push(value);
23992415
break;
2400-
}
2401-
case "date":
2402-
{
2403-
const dimension: IPivotDimension = new IgxPivotDateDimension(
2416+
}
2417+
case "date":
24042418
{
2405-
memberName: field,
2406-
enabled: isFirstDate,
2407-
dataType: dataType
2419+
const dimension: IPivotDimension = new IgxPivotDateDimension(
2420+
{
2421+
memberName: field,
2422+
enabled: isFirstDate,
2423+
dataType: dataType
2424+
}
2425+
)
2426+
rowDimensions.push(dimension);
2427+
isFirstDate = false;
2428+
break;
24082429
}
2409-
)
2410-
rowDimensions.push(dimension);
2411-
isFirstDate = false;
2412-
break;
2413-
}
24142430
default: {
24152431
const dimension: IPivotDimension = {
24162432
memberName: field,

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ export class IgxPivotHeaderRowComponent extends IgxGridHeaderRowComponent implem
156156
@Inject(IGX_GRID_BASE) public override grid: PivotGridType,
157157
ref: ElementRef<HTMLElement>,
158158
cdr: ChangeDetectorRef,
159-
protected renderer: Renderer2,
159+
protected renderer: Renderer2
160160
) {
161161
super(ref, cdr);
162162
}
@@ -426,8 +426,13 @@ export class IgxPivotHeaderRowComponent extends IgxGridHeaderRowComponent implem
426426
* @internal
427427
*/
428428
public onAggregationChange(event: ISelectionEventArgs) {
429+
429430
if (!this.isSelected(event.newSelection.value)) {
430431
this.value.aggregate = event.newSelection.value;
432+
const isSingleValue = this.grid.values.length === 1;
433+
434+
PivotUtil.updateColumnTypeByAggregator(this.grid.columns, this.value, isSingleValue);
435+
431436
this.grid.pipeTrigger++;
432437
}
433438
}

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

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { DataUtil, GridColumnDataType } from '../../data-operations/data-util';
33
import { FilteringLogic } from '../../data-operations/filtering-expression.interface';
44
import { FilteringExpressionsTree } from '../../data-operations/filtering-expressions-tree';
55
import { ISortingExpression } from '../../data-operations/sorting-strategy';
6-
import { PivotGridType } from '../common/grid.interface';
6+
import { ColumnType, PivotGridType } from '../common/grid.interface';
77
import { IGridSortingStrategy, IgxSorting } from '../common/strategy';
88
import { IgxPivotAggregate, IgxPivotDateAggregate, IgxPivotNumericAggregate, IgxPivotTimeAggregate } from './pivot-grid-aggregate';
99
import { IPivotAggregator, IPivotConfiguration, IPivotDimension, IPivotGridRecord, IPivotKeys, IPivotValue, PivotDimensionType, PivotSummaryPosition } from './pivot-grid.interface';
@@ -88,13 +88,13 @@ export class PivotUtil {
8888
}
8989

9090
public static flattenGroupsHorizontally(data: IPivotGridRecord[],
91-
dimension: IPivotDimension,
92-
expansionStates,
93-
defaultExpand: boolean,
94-
visibleDimensions: IPivotDimension[],
95-
summariesPosition: PivotSummaryPosition,
96-
parent?: IPivotDimension,
97-
parentRec?: IPivotGridRecord) {
91+
dimension: IPivotDimension,
92+
expansionStates,
93+
defaultExpand: boolean,
94+
visibleDimensions: IPivotDimension[],
95+
summariesPosition: PivotSummaryPosition,
96+
parent?: IPivotDimension,
97+
parentRec?: IPivotGridRecord) {
9898
for (let i = 0; i < data.length; i++) {
9999
const rec = data[i];
100100
const field = dimension.memberName;
@@ -316,7 +316,7 @@ export class PivotUtil {
316316
const aggregationKey = groupName ? groupName + pivotKeys.columnDimensionSeparator + key : key;
317317
rec.aggregationValues.set(aggregationKey, aggregationData[key]);
318318
});
319-
} else if (aggregationKeys.length === 1) {
319+
} else if (aggregationKeys.length === 1) {
320320
const aggregationKey = aggregationKeys[0];
321321
rec.aggregationValues.set(groupName || aggregationKey, aggregationData[aggregationKey]);
322322
}
@@ -508,5 +508,24 @@ export class PivotUtil {
508508
}
509509
}
510510

511+
public static updateColumnTypeByAggregator(columns: any[], value: IPivotValue, isSingleValue: boolean): void {
512+
const targetColumnType = PivotUtil.getColumnDataTypeForValue(value);
513+
columns.forEach(column => {
514+
if ((column.field?.includes(value.member) || isSingleValue) && targetColumnType !== undefined) {
515+
column.dataType = targetColumnType;
516+
}
517+
})
518+
}
519+
520+
private static getColumnDataTypeForValue(value: IPivotValue): GridColumnDataType {
521+
const isCountAggregator = value.aggregate.aggregator?.name?.toLowerCase() === 'count' || value.aggregate.aggregatorName?.toLowerCase() === 'count';
511522

523+
if ((value.dataType === GridColumnDataType.Currency || value.dataType === GridColumnDataType.Percent) && isCountAggregator) {
524+
return GridColumnDataType.Number;
525+
} else if (value.dataType === GridColumnDataType.Currency && !isCountAggregator) {
526+
return GridColumnDataType.Currency;
527+
} else if (value.dataType === GridColumnDataType.Percent && !isCountAggregator) {
528+
return GridColumnDataType.Percent;
529+
}
530+
}
512531
}

projects/igniteui-angular/src/lib/splitter/splitter-pane/splitter-pane.component.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Component, HostBinding, Input, ElementRef, Output, EventEmitter, booleanAttribute } from '@angular/core';
1+
import { Component, HostBinding, Input, ElementRef, Output, EventEmitter, booleanAttribute, signal } from '@angular/core';
22

33
/**
44
* Represents individual resizable/collapsible panes.
@@ -22,6 +22,7 @@ import { Component, HostBinding, Input, ElementRef, Output, EventEmitter, boolea
2222
export class IgxSplitterPaneComponent {
2323
private _minSize: string;
2424
private _maxSize: string;
25+
private _order = signal<number | null>(null);
2526

2627
/**
2728
* @hidden @internal
@@ -102,7 +103,12 @@ export class IgxSplitterPaneComponent {
102103

103104
/** @hidden @internal */
104105
@HostBinding('style.order')
105-
public order!: number;
106+
public get order() {
107+
return this._order();
108+
}
109+
public set order(val) {
110+
this._order.set(val)
111+
}
106112

107113
/**
108114
* @hidden @internal

projects/igniteui-angular/src/lib/splitter/splitter.component.spec.ts

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ describe('IgxSplitter', () => {
3333
const secondPane = splitter.panes.toArray()[1].element;
3434
expect(firstPane.textContent.trim()).toBe('Pane 1');
3535
expect(secondPane.textContent.trim()).toBe('Pane 2');
36-
36+
fixture.detectChanges();
3737
const splitterBar = fixture.debugElement.query(By.css(SPLITTERBAR_CLASS)).nativeElement;
3838
expect(firstPane.style.order).toBe('0');
3939
expect(splitterBar.style.order).toBe('1');
@@ -322,6 +322,13 @@ describe('IgxSplitter', () => {
322322

323323
expect(splitterBarComponent.style.transform).not.toBe('translate3d(0px, 0px, 0px)');
324324
});
325+
326+
it('should render correctly panes created dynamically using @for', () => {
327+
fixture = TestBed.createComponent(SplitterForOfPanesComponent);
328+
fixture.detectChanges();
329+
splitter = fixture.componentInstance.splitter;
330+
expect(splitter.panes.length).toBe(3);
331+
});
325332
});
326333

327334
describe('IgxSplitter pane toggle', () => {
@@ -336,6 +343,7 @@ describe('IgxSplitter pane toggle', () => {
336343
fixture = TestBed.createComponent(SplitterTogglePaneComponent);
337344
fixture.detectChanges();
338345
splitter = fixture.componentInstance.splitter;
346+
fixture.detectChanges();
339347
}));
340348

341349
it('should collapse/expand panes', () => {
@@ -601,3 +609,19 @@ export class SplitterTogglePaneComponent extends SplitterTestComponent {
601609
})
602610
export class SplitterCollapsedPaneComponent extends SplitterTestComponent {
603611
}
612+
613+
@Component({
614+
template: `
615+
<igx-splitter>
616+
@for (number of numbers; track number) {
617+
<igx-splitter-pane>
618+
<p>{{ number }}</p>
619+
</igx-splitter-pane>
620+
}
621+
</igx-splitter>
622+
`,
623+
imports: [IgxSplitterComponent, IgxSplitterPaneComponent]
624+
})
625+
export class SplitterForOfPanesComponent extends SplitterTestComponent {
626+
public numbers = [1, 2, 3];
627+
}

0 commit comments

Comments
 (0)