Skip to content

Commit 0fa4333

Browse files
MKirovaMKirova
authored andcommitted
chore(*): merge from base.
2 parents 96d023e + e59729c commit 0fa4333

File tree

12 files changed

+241
-33
lines changed

12 files changed

+241
-33
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ You can include Ignite UI for Angular in your project as a dependency using the
218218

219219
- [COVID-19 Dashboard](https://github.com/IgniteUI/COVID-19-Dashboard) - This dynamic dashboard was built using Indigo.Design and Ignite UI for Angular leveraging timely reports data from CSSEGISandData/COVID-19 to create an useful and impactful visualization. Built in a matter of hours, it showcases the Ignite UI Category and Data Charts, Map and List components for Angular and the how easy it is to get those quickly configured and populated with data.
220220

221-
-[Inventory Management App](https://github.com/IgniteUI/InventoryManagementApp) - The Inventory Management App consists of 2 pages: The Products Page and the Dashboard Page. The Products Page contains a grid with product information and includes a number of useful features
221+
- [Inventory Management App](https://github.com/IgniteUI/InventoryManagementApp) - The Inventory Management App consists of 2 pages: The Products Page and the Dashboard Page. The Products Page contains a grid with product information and includes a number of useful features
222222

223223
### Angular apps with ASP.NET Core Web Application
224224
If you consider Angular client side application with ASP.NET Core application you can check out our [ASP.NET-Core-Samples](https://github.com/IgniteUI/ASP.NET-Core-Samples)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ import { FilteringLogic, IFilteringExpression } from '../data-operations/filteri
4343
import { IGroupByRecord } from '../data-operations/groupby-record.interface';
4444
import { IgxGridForOfDirective } from '../directives/for-of/for_of.directive';
4545
import { IgxTextHighlightDirective } from '../directives/text-highlight/text-highlight.directive';
46-
import { IgxSummaryOperand, ISummaryExpression } from './summaries/grid-summary';
46+
import { ISummaryExpression } from './summaries/grid-summary';
4747
import { RowEditPositionStrategy, IPinningConfig } from './grid.common';
4848
import { IgxGridToolbarComponent } from './toolbar/grid-toolbar.component';
4949
import { IgxRowDirective } from './row.directive';

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ export class IgxPivotFilteringService extends IgxFilteringService {
1818
const config = (grid as IgxPivotGridComponent).pivotConfiguration;
1919
const allDimensions = PivotUtil.flatten(config.rows.concat(config.columns).concat(config.filters).filter(x => x !== null && x !== undefined));
2020
const dim = allDimensions.find(x => x.memberName === fieldName || x.member === fieldName);
21-
dim.filters = undefined;
21+
dim.filter = undefined;
2222
grid.filteringPipeTrigger++;
23-
if (PivotUtil.flatten(config.columns).indexOf(dim) !== -1) {
23+
if (allDimensions.indexOf(dim) !== -1) {
2424
// update columns
2525
(grid as any).setupColumns();
2626
}
@@ -33,16 +33,16 @@ export class IgxPivotFilteringService extends IgxFilteringService {
3333
const allDimensions = PivotUtil.flatten(config.rows.concat(config.columns).concat(config.filters).filter(x => x !== null && x !== undefined));
3434
const enabledDimensions = allDimensions.filter(x => x && x.enabled);
3535
const dim = enabledDimensions.find(x => x.memberName === fieldName || x.member === fieldName);
36-
const filteringTree = dim.filters || new FilteringExpressionsTree(FilteringLogic.And);
36+
const filteringTree = dim.filter || new FilteringExpressionsTree(FilteringLogic.And);
3737
const fieldFilterIndex = filteringTree.findIndex(fieldName);
3838
if (fieldFilterIndex > -1) {
3939
filteringTree.filteringOperands.splice(fieldFilterIndex, 1);
4040
}
4141

4242
this.prepare_filtering_expression(filteringTree, fieldName, term, conditionOrExpressionsTree, ignoreCase, fieldFilterIndex);
43-
dim.filters = filteringTree;
43+
dim.filter = filteringTree;
4444
grid.filteringPipeTrigger++;
45-
if (PivotUtil.flatten(config.columns).indexOf(dim) !== -1) {
45+
if (allDimensions.indexOf(dim) !== -1) {
4646
// update columns
4747
(grid as any).setupColumns();
4848
}

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

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import {
77
EventEmitter,
88
ComponentFactoryResolver,
99
ElementRef,
10-
forwardRef,
1110
HostBinding,
1211
Inject,
1312
Input,
@@ -30,10 +29,10 @@ import { IgxGridBaseDirective } from '../grid-base.directive';
3029
import { IgxFilteringService } from '../filtering/grid-filtering.service';
3130
import { IgxGridSelectionService } from '../selection/selection.service';
3231
import { IgxForOfSyncService, IgxForOfScrollSyncService } from '../../directives/for-of/for_of.sync.service';
33-
import { GridServiceType, GridType, IGX_GRID_BASE, IGX_GRID_SERVICE_BASE, RowType } from '../common/grid.interface';
32+
import { GridType, IGX_GRID_BASE, RowType } from '../common/grid.interface';
3433
import { IgxGridCRUDService } from '../common/crud.service';
3534
import { IgxGridSummaryService } from '../summaries/grid-summary.service';
36-
import { DEFAULT_PIVOT_KEYS, IDimensionsChange, IPivotConfiguration, IPivotDimension, IPivotKeys, IValuesChange, PivotDimensionType } from './pivot-grid.interface';
35+
import { DEFAULT_PIVOT_KEYS, IDimensionsChange, IPivotConfiguration, IPivotDimension, IValuesChange, PivotDimensionType } from './pivot-grid.interface';
3736
import { IgxPivotHeaderRowComponent } from './pivot-header-row.component';
3837
import { IgxColumnGroupComponent } from '../columns/column-group.component';
3938
import { IgxColumnComponent } from '../columns/column.component';
@@ -316,6 +315,13 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
316315
*/
317316
public dragRowID = null;
318317

318+
/**
319+
* @hidden @internal
320+
*/
321+
public get rootSummariesEnabled(): boolean {
322+
return false;
323+
}
324+
319325
protected _defaultExpandState = false;
320326
private _data;
321327
private _filteredData;
@@ -545,6 +551,8 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
545551
// pivot grid always generates columns automatically.
546552
this.autoGenerate = true;
547553
this.uniqueColumnValuesStrategy = this.uniqueColumnValuesStrategy || this.uniqueDimensionValuesStrategy;
554+
const config = this.pivotConfiguration;
555+
this.filteringExpressionsTree = PivotUtil.buildExpressionTree(config);
548556
super.ngOnInit();
549557
}
550558

@@ -1050,7 +1058,7 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
10501058
*/
10511059
protected autogenerateColumns() {
10521060
let columns = [];
1053-
const data = this.gridAPI.get_data();
1061+
const data = this.gridAPI.filterDataByExpressions(this.filteringExpressionsTree);
10541062
this.dimensionDataColumns = this.generateDimensionColumns();
10551063
let fieldsMap;
10561064
if (this.pivotConfiguration.columnStrategy && this.pivotConfiguration.columnStrategy instanceof NoopPivotDimensionsStrategy) {
@@ -1130,9 +1138,9 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
11301138
}
11311139
currentFields.forEach((value, key) => {
11321140
let shouldGenerate = true;
1133-
if (value.dimension && value.dimension.filters) {
1141+
if (value.dimension && value.dimension.filter) {
11341142
const state = {
1135-
expressionsTree: value.dimension.filters.filteringOperands[0],
1143+
expressionsTree: value.dimension.filter.filteringOperands[0],
11361144
strategy: this.filterStrategy || new DimensionValuesFilteringStrategy(),
11371145
advancedFilteringExpressionsTree: this.advancedFilteringExpressionsTree
11381146
};

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

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { IgxPivotNumericAggregate } from './pivot-grid-aggregate';
66
import { IPivotConfiguration } from './pivot-grid.interface';
77
import { IgxPivotColumnPipe, IgxPivotRowExpansionPipe, IgxPivotRowPipe } from './pivot-grid.pipes';
88
import { PivotGridFunctions } from '../../test-utils/pivot-grid-functions.spec';
9+
import { DATA } from 'src/app/shared/pivot-data';
910

1011
describe('Pivot pipes #pivotGrid', () => {
1112
let rowPipe: IgxPivotRowPipe;
@@ -1532,4 +1533,117 @@ describe('Pivot pipes #pivotGrid', () => {
15321533
{ Years: '2021', AllProduct: 'All Products', Discontinued: 'false', Country: 'USA', SellerName: 'John' }
15331534
]);
15341535
});
1536+
// automation for https://github.com/IgniteUI/igniteui-angular/issues/10545
1537+
it('should generate last dimension values for all records.', () => {
1538+
data = [
1539+
{
1540+
ProductCategory: 'Clothing', UnitPrice: 12.81, SellerName: 'Stanley',
1541+
Country: 'Bulgaria', City: 'Sofia', Date: '01/01/2021', UnitsSold: 282
1542+
},
1543+
{
1544+
ProductCategory: 'Clothing', UnitPrice: 49.57, SellerName: 'Elisa',
1545+
Country: 'USA', City: 'New York', Date: '01/05/2019', UnitsSold: 296
1546+
},
1547+
{
1548+
ProductCategory: 'Bikes', UnitPrice: 3.56, SellerName: 'Lydia',
1549+
Country: 'Uruguay', City: 'Ciudad de la Costa', Date: '01/06/2020', UnitsSold: 68
1550+
},
1551+
{
1552+
ProductCategory: 'Accessories', UnitPrice: 85.58, SellerName: 'David',
1553+
Country: 'USA', City: 'New York', Date: '04/07/2021', UnitsSold: 293
1554+
},
1555+
{
1556+
ProductCategory: 'Components', UnitPrice: 18.13, SellerName: 'John',
1557+
Country: 'USA', City: 'New York', Date: '12/08/2021', UnitsSold: 240
1558+
},
1559+
{
1560+
ProductCategory: 'Clothing', UnitPrice: 68.33, SellerName: 'Larry',
1561+
Country: 'Uruguay', City: 'Ciudad de la Costa', Date: '05/12/2020', UnitsSold: 456
1562+
},
1563+
{
1564+
ProductCategory: 'Clothing', UnitPrice: 16.05, SellerName: 'Walter',
1565+
Country: 'Bulgaria', City: 'Plovdiv', Date: '02/19/2020', UnitsSold: 492
1566+
}];
1567+
pivotConfig.columns = [{
1568+
memberName: 'Country',
1569+
enabled: true
1570+
}];
1571+
pivotConfig.rows = [
1572+
new IgxPivotDateDimension(
1573+
{
1574+
memberName: 'Date',
1575+
enabled: true
1576+
},
1577+
{
1578+
months: false
1579+
}
1580+
),
1581+
{
1582+
memberName: 'City',
1583+
enabled: true
1584+
},
1585+
{
1586+
memberFunction: () => 'All',
1587+
memberName: 'AllProducts',
1588+
enabled: true,
1589+
childLevel: {
1590+
memberFunction: (recData) => recData.ProductCategory,
1591+
memberName: 'ProductCategory',
1592+
enabled: true
1593+
}
1594+
},
1595+
{
1596+
memberName: 'SellerName',
1597+
enabled: true
1598+
}
1599+
];
1600+
const rowPipeResult = rowPipe.transform(data, pivotConfig, expansionStates);
1601+
const columnPipeResult = columnPipe.transform(rowPipeResult, pivotConfig, new Map<any, boolean>());
1602+
const rowStatePipeResult = rowStatePipe.transform(columnPipeResult, pivotConfig, expansionStates, true);
1603+
const sellers = rowStatePipeResult.map(x => x.SellerName);
1604+
// there should be no empty values.
1605+
expect(sellers.filter(x => x === undefined).length).toBe(0);
1606+
});
1607+
1608+
// automation for https://github.com/IgniteUI/igniteui-angular/issues/10662
1609+
it('should retain processed values for last dimension when bound to complex object.', () => {
1610+
data = DATA;
1611+
pivotConfig.rows = [
1612+
{
1613+
memberName: 'Date',
1614+
enabled: true,
1615+
},
1616+
{
1617+
memberName: 'AllProduct',
1618+
memberFunction: () => 'All Products',
1619+
enabled: true,
1620+
childLevel:
1621+
{
1622+
1623+
memberName: 'Product',
1624+
memberFunction: (recData) => recData.Product.Name,
1625+
enabled: true
1626+
}
1627+
},
1628+
{
1629+
memberName: 'AllSeller',
1630+
memberFunction: () => 'All Sellers',
1631+
enabled: true,
1632+
childLevel:
1633+
{
1634+
memberName: 'Seller',
1635+
memberFunction: (recData) => recData.Seller.Name,
1636+
enabled: true,
1637+
},
1638+
},
1639+
];
1640+
1641+
const rowPipeResult = rowPipe.transform(data, pivotConfig, expansionStates);
1642+
const columnPipeResult = columnPipe.transform(rowPipeResult, pivotConfig, new Map<any, boolean>());
1643+
const rowStatePipeResult = rowStatePipe.transform(columnPipeResult, pivotConfig, expansionStates, true);
1644+
1645+
const res = rowStatePipeResult.filter(x => x.AllSeller === undefined).map(x => x.Seller);
1646+
// all values should be strings as the result of the processed member function is string.
1647+
expect(res.filter(x => typeof x !== 'string').length).toBe(0);
1648+
});
15351649
});

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

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -192,16 +192,8 @@ export class IgxPivotGridFilterPipe implements PipeTransform {
192192
advancedExpressionsTree: IFilteringExpressionsTree,
193193
_filterPipeTrigger: number,
194194
_pipeTrigger: number): any[] {
195-
const allDimensions = config.rows.concat(config.columns).concat(config.filters).filter(x => x !== null && x !== undefined);
196-
const enabledDimensions = allDimensions.filter(x => x && x.enabled);
195+
const expressionsTree = PivotUtil.buildExpressionTree(config);
197196

198-
const expressionsTree = new FilteringExpressionsTree(FilteringLogic.And);
199-
// add expression trees from all filters
200-
PivotUtil.flatten(enabledDimensions).forEach(x => {
201-
if (x.filters) {
202-
expressionsTree.filteringOperands.push(x.filters);
203-
}
204-
});
205197
const state = {
206198
expressionsTree,
207199
strategy: filterStrategy || new DimensionValuesFilteringStrategy(),

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

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { fakeAsync, TestBed } from '@angular/core/testing';
22
import { By } from '@angular/platform-browser';
33
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
4-
import { IgxPivotDateDimension, IgxPivotGridModule } from 'igniteui-angular';
4+
import { FilteringExpressionsTree, FilteringLogic, IgxPivotDateDimension, IgxPivotGridModule, IgxStringFilteringOperand } from 'igniteui-angular';
55
import { IgxChipsAreaComponent } from '../../chips/chips-area.component';
66
import { configureTestSuite } from '../../test-utils/configure-suite';
77
import { GridFunctions, GridSelectionFunctions } from '../../test-utils/grid-functions.spec';
@@ -110,6 +110,37 @@ describe('Basic IgxPivotGrid #pivotGrid', () => {
110110
expect(pivotGrid.columns.length).not.toBe(9);
111111
});
112112

113+
it('should remove filter dimension from chip', () => {
114+
const pivotGrid = fixture.componentInstance.pivotGrid;
115+
116+
const filteringExpressionTree = new FilteringExpressionsTree(FilteringLogic.And);
117+
filteringExpressionTree.filteringOperands = [
118+
{
119+
condition: IgxStringFilteringOperand.instance().condition('equals'),
120+
fieldName: 'SellerName',
121+
searchVal: 'Stanley'
122+
}
123+
];
124+
const filterDimension = {
125+
memberName: 'SellerName',
126+
enabled: true,
127+
filter: filteringExpressionTree
128+
};
129+
pivotGrid.pivotConfiguration.filters = [filterDimension];
130+
pivotGrid.pipeTrigger++;
131+
fixture.detectChanges();
132+
expect(pivotGrid.pivotConfiguration.filters[0].enabled).toBeTrue();
133+
expect(pivotGrid.rowList.length).toBe(2);
134+
135+
const headerRow = fixture.nativeElement.querySelector('igx-pivot-header-row');
136+
const rowChip = headerRow.querySelector('igx-chip[id="SellerName"]');
137+
const removeIcon = rowChip.querySelectorAll('igx-icon')[2];
138+
removeIcon.click();
139+
fixture.detectChanges();
140+
expect(pivotGrid.pivotConfiguration.filters[0].enabled).toBeFalse();
141+
expect(pivotGrid.rowList.length).toBe(5);
142+
});
143+
113144
it('should collapse column with 1 value dimension', () => {
114145
const pivotGrid = fixture.componentInstance.pivotGrid;
115146
pivotGrid.pivotConfiguration.values.pop();
@@ -484,6 +515,29 @@ describe('Basic IgxPivotGrid #pivotGrid', () => {
484515
expect(pivotGrid.gridAPI.get_cell_by_index(0, 'USA').value).toBe(0);
485516
expect(pivotGrid.gridAPI.get_cell_by_index(0, 'Uruguay').value).toBe(242.08);
486517
});
518+
it('should show one aggregations drop-down at a time', () => {
519+
const pivotGrid = fixture.componentInstance.pivotGrid;
520+
pivotGrid.width = '1500px';
521+
fixture.detectChanges();
522+
const headerRow = fixture.nativeElement.querySelector('igx-pivot-header-row');
523+
const valueChipUnitsSold = headerRow.querySelector('igx-chip[id="UnitsSold"]');
524+
525+
const aggregatesIconUnitsSold = valueChipUnitsSold.querySelectorAll('igx-icon')[1];
526+
aggregatesIconUnitsSold.click();
527+
fixture.detectChanges();
528+
529+
let dropDown = fixture.debugElement.queryAll(By.css(`.${CSS_CLASS_LIST}`));
530+
expect(dropDown.length).toBe(1);
531+
532+
const valueChipUnitPrice = headerRow.querySelector('igx-chip[id="UnitPrice"]');
533+
534+
const aggregatesIconUnitPrice = valueChipUnitPrice.querySelectorAll('igx-icon')[1];
535+
aggregatesIconUnitPrice.click();
536+
fixture.detectChanges();
537+
538+
dropDown = fixture.debugElement.queryAll(By.css(`.${CSS_CLASS_LIST}`));
539+
expect(dropDown.length).toBe(1);
540+
});
487541

488542
it('should allow reorder in row chip area.', () => {
489543
const pivotGrid = fixture.componentInstance.pivotGrid;

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,8 @@ export class IgxPivotHeaderRowComponent extends IgxGridHeaderRowComponent {
120120
this.grid.setupColumns();
121121
this.grid.filteringService.clearFilter(col.memberName);
122122
this.grid.pipeTrigger++;
123-
this.grid.dimensionsChange.emit({ dimensions: this.grid.pivotConfiguration.columns, dimensionCollectionType: PivotDimensionType.Row });
123+
this.grid.dimensionsChange.emit({dimensions: this.grid.pivotConfiguration.columns, dimensionCollectionType: PivotDimensionType.Row});
124+
this.grid.reflow();
124125
}
125126

126127
public valueRemoved(event: IBaseChipEventArgs) {

0 commit comments

Comments
 (0)