Skip to content

Commit 66f2ef6

Browse files
authored
Merge branch 'master' into iganchev/add-tests-i18n
2 parents 030ac20 + c7b0c23 commit 66f2ef6

25 files changed

+180
-157
lines changed

CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ All notable changes for each version of this project will be documented in this
99
- Exporter services are no longer required to be provided in the application since they are now injected on a root level.
1010
- `IgxGridToolbarPinningComponent`, `IgxGridToolbarHidingComponent`
1111
- Exposed new input `buttonText` which sets the text that is displayed inside the dropdown button in the toolbar.
12+
- `IgxCombo`
13+
- Added `groupSortingDirection` input, which allows you to set groups sorting order.
1214

1315
### General
1416

@@ -33,6 +35,12 @@ All notable changes for each version of this project will be documented in this
3335
- `IgxColumnActionsComponent`
3436
- **Breaking Change** - The following input has been removed
3537
- Input `columns`. Use `igxGrid` `columns` input instead.
38+
39+
## 12.2.3
40+
41+
### General
42+
- **Breaking Change** - `IgxPercentSummaryOperand` and `IgxCurrencySummaryOperand` have been removed and `IgxNumberSummaryOperand` should be used instead. If you have used the percent or currency summary operands to extend a custom summary operand from them, then change the custom operand to extend from the number summary operand.
43+
3644
## 12.2.1
3745

3846
### New Features
@@ -3657,3 +3665,4 @@ export class IgxCustomFilteringOperand extends IgxFilteringOperand {
36573665
- `IgxDraggableDirective` moved inside `../directives/dragdrop/` folder
36583666
- `IgxRippleDirective` moved inside `../directives/ripple/` folder
36593667
- Folder `"./navigation/nav-service"` renamed to `"./navigation/nav.service"`
3668+

projects/igniteui-angular/src/lib/combo/combo.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252
[tabindex]="dropdown.collapsed ? -1 : 0" role="listbox" [attr.id]="dropdown.id">
5353
<igx-combo-item role="option" [itemHeight]='itemHeight' *igxFor="let item of data
5454
| comboFiltering:filterValue:displayKey:filterable:filteringOptions
55-
| comboGrouping:groupKey:valueKey;
55+
| comboGrouping:groupKey:valueKey:groupSortingDirection;
5656
index as rowIndex; containerSize: itemsMaxHeight; scrollOrientation: 'vertical'; itemSize: itemHeight"
5757
[value]="item" [isHeader]="item.isHeader" [index]="rowIndex">
5858
<ng-container *ngIf="item.isHeader">

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import { AbsoluteScrollStrategy, ConnectedPositioningStrategy } from '../service
2828
import { IgxSelectionAPIService } from '../core/selection';
2929
import { IgxIconService } from '../icon/public_api';
3030
import { IBaseCancelableBrowserEventArgs } from '../core/utils';
31+
import { SortingDirection } from '../data-operations/sorting-expression.interface';
3132

3233
const CSS_CLASS_COMBO = 'igx-combo';
3334
const CSS_CLASS_COMBO_DROPDOWN = 'igx-combo__drop-down';
@@ -2172,6 +2173,17 @@ describe('igxCombo', () => {
21722173
expect(combo.dropdown.headers.length).toEqual(1);
21732174
expect(combo.dropdown.headers[0].element.nativeElement.innerText).toEqual(fallBackGroup);
21742175
});
2176+
it('should sort groups correctly', () => {
2177+
combo.groupSortingDirection = SortingDirection.Asc;
2178+
combo.toggle();
2179+
fixture.detectChanges();
2180+
expect(combo.dropdown.headers[0].element.nativeElement.innerText).toEqual('East North Central');
2181+
2182+
combo.groupSortingDirection = SortingDirection.Desc;
2183+
combo.toggle();
2184+
fixture.detectChanges();
2185+
expect(combo.dropdown.headers[0].element.nativeElement.innerText).toEqual('West South Cent');
2186+
});
21752187
});
21762188
describe('Filtering tests: ', () => {
21772189
configureTestSuite();

projects/igniteui-angular/src/lib/combo/combo.component.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import { EditorProvider } from '../core/edit-provider';
4040
import { IgxInputState, IgxInputDirective } from '../directives/input/input.directive';
4141
import { IgxInputGroupType, IGX_INPUT_GROUP_TYPE } from '../input-group/public_api';
4242
import { caseSensitive } from '@igniteui/material-icons-extended';
43+
import { SortingDirection } from '../data-operations/sorting-expression.interface';
4344

4445
/**
4546
* @hidden
@@ -774,6 +775,25 @@ export class IgxComboComponent extends DisplayDensityBase implements IgxComboBas
774775
@Input()
775776
public filterable = true;
776777

778+
/**
779+
* An @Input property that sets groups sorting order.
780+
*
781+
* @example
782+
* ```html
783+
* <igx-combo [groupSortingDirection]="groupSortingDirection"></igx-combo>
784+
* ```
785+
* ```typescript
786+
* public groupSortingDirection = SortingDirection.Asc;
787+
* ```
788+
*/
789+
@Input()
790+
public get groupSortingDirection(): SortingDirection {
791+
return this._groupSortingDirection;
792+
}
793+
public set groupSortingDirection(val: SortingDirection) {
794+
this._groupSortingDirection = val;
795+
}
796+
777797
/**
778798
* An @Input property that set aria-labelledby attribute
779799
* ```html
@@ -906,6 +926,7 @@ export class IgxComboComponent extends DisplayDensityBase implements IgxComboBas
906926
private _overlaySettings: OverlaySettings;
907927
private _value = '';
908928
private _valid = IgxComboState.INITIAL;
929+
private _groupSortingDirection: SortingDirection = SortingDirection.Asc;
909930

910931
constructor(
911932
protected elementRef: ElementRef,

projects/igniteui-angular/src/lib/combo/combo.pipes.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,14 +44,14 @@ export class IgxComboGroupingPipe implements PipeTransform {
4444

4545
constructor(@Inject(IGX_COMBO_COMPONENT) public combo: IgxComboBase) { }
4646

47-
public transform(collection: any[], groupKey: any, valueKey: any) {
47+
public transform(collection: any[], groupKey: any, valueKey: any, sortingDirection: SortingDirection) {
4848
this.combo.filteredData = collection;
4949
if ((!groupKey && groupKey !== 0) || !collection.length) {
5050
return collection;
5151
}
5252
const sorted = DataUtil.sort(cloneArray(collection), [{
5353
fieldName: groupKey,
54-
dir: SortingDirection.Asc,
54+
dir: sortingDirection,
5555
ignoreCase: true,
5656
strategy: DefaultSortingStrategy.instance()
5757
}]);

projects/igniteui-angular/src/lib/grids/columns/column.component.ts

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ import { IgxGridFilteringCellComponent } from '../filtering/base/grid-filtering-
3838
import { IgxGridHeaderGroupComponent } from '../headers/grid-header-group.component';
3939
import {
4040
IgxSummaryOperand, IgxNumberSummaryOperand, IgxDateSummaryOperand,
41-
IgxCurrencySummaryOperand, IgxPercentSummaryOperand, IgxSummaryResult, IgxTimeSummaryOperand
41+
IgxSummaryResult, IgxTimeSummaryOperand
4242
} from '../summaries/grid-summary';
4343
import {
4444
IgxCellTemplateDirective,
@@ -1711,6 +1711,8 @@ export class IgxColumnComponent implements AfterContentInit, OnDestroy {
17111711
this.summaries = IgxSummaryOperand;
17121712
break;
17131713
case GridColumnDataType.Number:
1714+
case GridColumnDataType.Currency:
1715+
case GridColumnDataType.Percent:
17141716
this.summaries = IgxNumberSummaryOperand;
17151717
break;
17161718
case GridColumnDataType.Date:
@@ -1720,12 +1722,6 @@ export class IgxColumnComponent implements AfterContentInit, OnDestroy {
17201722
case GridColumnDataType.Time:
17211723
this.summaries = IgxTimeSummaryOperand;
17221724
break;
1723-
case GridColumnDataType.Currency:
1724-
this.summaries = IgxCurrencySummaryOperand;
1725-
break;
1726-
case GridColumnDataType.Percent:
1727-
this.summaries = IgxPercentSummaryOperand;
1728-
break;
17291725
default:
17301726
this.summaries = IgxSummaryOperand;
17311727
break;

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

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import { SortingDirection } from '../../data-operations/sorting-expression.inter
3131
import { DropPosition } from '../moving/moving.service';
3232
import { DatePipe } from '@angular/common';
3333
import { IgxGridGroupByRowComponent } from './groupby-row.component';
34+
import { IColumnPipeArgs } from 'igniteui-angular';
3435

3536
describe('IgxGrid - Summaries #grid', () => {
3637

@@ -154,7 +155,7 @@ describe('IgxGrid - Summaries #grid', () => {
154155
it('should properly render custom summaries', () => {
155156
const summaryRow = GridSummaryFunctions.getRootSummaryRow(fixture);
156157
GridSummaryFunctions.verifyColumnSummaries(summaryRow, 3, ['Count', 'Sum', 'Avg'], ['10', '39,004', '3,900.4']);
157-
GridSummaryFunctions.verifyColumnSummaries(summaryRow, 4, ['Earliest'], ['5/17/1990']);
158+
GridSummaryFunctions.verifyColumnSummaries(summaryRow, 4, ['Earliest', 'Items InStock'], ['May 17, 1990', '1337']);
158159

159160
grid.filter('UnitsInStock', '0', IgxNumberFilteringOperand.instance().condition('lessThan'), true);
160161
fixture.detectChanges();
@@ -181,7 +182,7 @@ describe('IgxGrid - Summaries #grid', () => {
181182
it('should change custom summaries at runtime', () => {
182183
const summaryRow = GridSummaryFunctions.getRootSummaryRow(fixture);
183184
GridSummaryFunctions.verifyColumnSummaries(summaryRow, 3, ['Count', 'Sum', 'Avg'], ['10', '39,004', '3,900.4']);
184-
GridSummaryFunctions.verifyColumnSummaries(summaryRow, 4, ['Earliest'], ['5/17/1990']);
185+
GridSummaryFunctions.verifyColumnSummaries(summaryRow, 4, ['Earliest', 'Items InStock'], ['May 17, 1990', '1337']);
185186
GridSummaryFunctions.verifyVisibleSummariesHeight(fixture, 3, grid.defaultSummaryHeight);
186187
grid.getColumnByName('UnitsInStock').summaries = fixture.componentInstance.dealsSummaryMinMax;
187188
fixture.detectChanges();
@@ -192,20 +193,20 @@ describe('IgxGrid - Summaries #grid', () => {
192193
it('should be able to access alldata from each summary', () => {
193194
const summaryRow = GridSummaryFunctions.getRootSummaryRow(fixture);
194195
GridSummaryFunctions.verifyColumnSummaries(summaryRow, 3, ['Count', 'Sum', 'Avg'], ['10', '39,004', '3,900.4']);
195-
GridSummaryFunctions.verifyColumnSummaries(summaryRow, 4, ['Earliest'], ['5/17/1990']);
196+
GridSummaryFunctions.verifyColumnSummaries(summaryRow, 4, ['Earliest', 'Items InStock'], ['May 17, 1990', '1337']);
196197
GridSummaryFunctions.verifyVisibleSummariesHeight(fixture, 3, grid.defaultSummaryHeight);
197198
grid.getColumnByName('UnitsInStock').summaries = fixture.componentInstance.inStockSummary;
198199
fixture.detectChanges();
199200

200201
GridSummaryFunctions.verifyColumnSummaries(summaryRow, 3, ['Count', 'Min', 'Max', 'Sum', 'Avg', 'Items InStock'],
201-
['10', '0', '20000', '39004', '3900.4', '6']);
202-
GridSummaryFunctions.verifyColumnSummaries(summaryRow, 4, ['Earliest'], ['5/17/1990']);
202+
['10', '0', '20,000', '39,004', '3,900.4', '6']);
203+
GridSummaryFunctions.verifyColumnSummaries(summaryRow, 4, ['Earliest', 'Items InStock'], ['May 17, 1990', '1337']);
203204

204205
grid.getCellByColumn(4, 'InStock').update(true);
205206
fixture.detectChanges();
206207

207208
GridSummaryFunctions.verifyColumnSummaries(summaryRow, 3, ['Count', 'Min', 'Max', 'Sum', 'Avg', 'Items InStock'],
208-
['10', '0', '20000', '39004', '3900.4', '7']);
209+
['10', '0', '20,000', '39,004', '3,900.4', '7']);
209210

210211
grid.filter('UnitsInStock', 0, IgxNumberFilteringOperand.instance().condition('equals'));
211212
fixture.detectChanges();
@@ -292,7 +293,7 @@ describe('IgxGrid - Summaries #grid', () => {
292293
expect(grid.hasSummarizedColumns).toBe(false);
293294
});
294295

295-
it('should change summary operand through grid API ', () => {
296+
it('should change summary operand through grid API', () => {
296297
grid.enableSummaries([{ fieldName: 'UnitsInStock', customSummary: fix.componentInstance.dealsSummaryMinMax }]);
297298
fix.detectChanges();
298299

@@ -2442,11 +2443,6 @@ class DealsSummary extends IgxNumberSummaryOperand {
24422443
public operate(summaries?: any[]): IgxSummaryResult[] {
24432444
const result = super.operate(summaries).filter((obj) => {
24442445
if (obj.key === 'average' || obj.key === 'sum' || obj.key === 'count') {
2445-
const summaryResult = obj.summaryResult;
2446-
// apply formatting to float numbers
2447-
if (Number(summaryResult) === summaryResult) {
2448-
obj.summaryResult = summaryResult.toLocaleString('en-us', { maximumFractionDigits: 2 });
2449-
}
24502446
return obj;
24512447
}
24522448
});
@@ -2462,11 +2458,6 @@ class DealsSummaryMinMax extends IgxNumberSummaryOperand {
24622458
public operate(summaries?: any[]): IgxSummaryResult[] {
24632459
const result = super.operate(summaries).filter((obj) => {
24642460
if (obj.key === 'min' || obj.key === 'max') {
2465-
const summaryResult = obj.summaryResult;
2466-
// apply formatting to float numbers
2467-
if (Number(summaryResult) === summaryResult) {
2468-
obj.summaryResult = summaryResult.toLocaleString('en-us', { maximumFractionDigits: 2 });
2469-
}
24702461
return obj;
24712462
}
24722463
});
@@ -2482,11 +2473,14 @@ class EarliestSummary extends IgxDateSummaryOperand {
24822473
public operate(summaries?: any[]): IgxSummaryResult[] {
24832474
const result = super.operate(summaries).filter((obj) => {
24842475
if (obj.key === 'earliest') {
2485-
const date = obj.summaryResult ? new Date(obj.summaryResult) : undefined;
2486-
obj.summaryResult = date ? new Intl.DateTimeFormat('en-US').format(date) : undefined;
24872476
return obj;
24882477
}
24892478
});
2479+
result.push({
2480+
key: 'test',
2481+
label: 'Items InStock',
2482+
summaryResult: 1337
2483+
});
24902484
return result;
24912485
}
24922486
}
@@ -2541,14 +2535,15 @@ class AllDataAvgSummary extends IgxSummaryOperand {
25412535

25422536
@Component({
25432537
template: `
2544-
<igx-grid #grid1 [data]="data" [primaryKey]="'ProductID'" [allowFiltering]="true">
2538+
<igx-grid #grid1 [data]="data" [primaryKey]="'ProductID'" [locale]="locale" [allowFiltering]="true">
25452539
<igx-column field="ProductID" header="Product ID">
25462540
</igx-column>
25472541
<igx-column field="ProductName" [hasSummary]="true">
25482542
</igx-column>
25492543
<igx-column field="InStock" [dataType]="'boolean'" [hasSummary]="true">
25502544
</igx-column>
2551-
<igx-column field="UnitsInStock" [dataType]="'number'" [hasSummary]="true" [summaries]="dealsSummary">
2545+
<igx-column field="UnitsInStock" [dataType]="'number'" [hasSummary]="true" [pipeArgs]="formatOptions"
2546+
[summaries]="dealsSummary">
25522547
</igx-column>
25532548
<igx-column field="OrderDate" width="200px" [dataType]="'date'" [sortable]="true" [hasSummary]="true"
25542549
[summaries]="earliest">
@@ -2566,5 +2561,9 @@ export class CustomSummariesComponent {
25662561
public earliest = EarliestSummary;
25672562
public inStockSummary = InStockSummary;
25682563
public allDataAvgSummary = AllDataAvgSummary;
2564+
public formatOptions: IColumnPipeArgs = {
2565+
digitsInfo: '1.0-2'
2566+
};
2567+
public locale = 'en-US';
25692568
}
25702569

projects/igniteui-angular/src/lib/grids/state.directive.spec.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,27 @@ describe('IgxGridState - input properties #grid', () => {
178178
expect(gridState).toBe(filteringState);
179179
});
180180

181+
it('setState should correctly restore grid filtering state from with null date values', () => {
182+
const fix = TestBed.createComponent(IgxGridStateComponent);
183+
fix.detectChanges();
184+
const grid = fix.componentInstance.grid;
185+
grid.getCellByColumn(0, 'OrderDate').value = null;
186+
fix.detectChanges();
187+
const state = fix.componentInstance.state;
188+
189+
const filteringState = '{"filtering":{"filteringOperands":[{"filteringOperands":[{"condition":{"name":"empty","isUnary":true,"iconName":"is-empty"},"fieldName":"OrderDate","ignoreCase":true,"searchVal":null}],"operator":1,"fieldName":"OrderDate"}],"operator":0,"type":0}}';
190+
const initialState = '{"filtering":{"filteringOperands":[],"operator":0}}';
191+
192+
let gridState = state.getState(true, 'filtering');
193+
expect(gridState).toBe(initialState);
194+
195+
state.setState(filteringState);
196+
gridState = state.getState(false, 'filtering') as IGridState;
197+
HelperFunctions.verifyFilteringExpressions(grid.filteringExpressionsTree, gridState);
198+
gridState = state.getState(true, 'filtering');
199+
expect(gridState).toBe(filteringState);
200+
});
201+
181202
it('setState should correctly restore grid filtering state from object', () => {
182203
const fix = TestBed.createComponent(IgxGridStateComponent);
183204
fix.detectChanges();

projects/igniteui-angular/src/lib/grids/state.directive.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -549,7 +549,7 @@ export class IgxGridStateDirective {
549549
if (Array.isArray(expr.searchVal)) {
550550
expr.searchVal = new Set(expr.searchVal);
551551
} else {
552-
expr.searchVal = (dataType === 'date') ? new Date(Date.parse(expr.searchVal)) : expr.searchVal;
552+
expr.searchVal = expr.searchVal && (dataType === 'date') ? new Date(Date.parse(expr.searchVal)) : expr.searchVal;
553553
}
554554
expr.condition = this.generateFilteringCondition(dataType, expr.condition.name);
555555
expressionsTree.filteringOperands.push(expr);

0 commit comments

Comments
 (0)