Skip to content

Commit 43a4df4

Browse files
authored
feat(h-grid): update samples with adv filtering subqueries (#3671)
1 parent 8373d96 commit 43a4df4

File tree

4 files changed

+158
-73
lines changed

4 files changed

+158
-73
lines changed

src/app/hierarchical-grid/hierarchical-grid-advanced-filtering/hierarchical-grid-advanced-filtering.component.html

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<div class="grid__wrapper">
2-
<igx-hierarchical-grid [igxPreventDocumentScroll]="true" class="hgrid" [data]="localdata" [autoGenerate]="false" [allowAdvancedFiltering]="true"
3-
[height]="'600px'" [width]="'100%'" [rowHeight]="'65px'" #hierarchicalGrid>
2+
<igx-hierarchical-grid #hGrid [igxPreventDocumentScroll]="true" class="hgrid" [data]="localData" [autoGenerate]="false" [allowAdvancedFiltering]="true"
3+
[height]="'600px'" [width]="'100%'" [rowHeight]="'65px'">
44
<igx-grid-toolbar></igx-grid-toolbar>
55

66
<igx-column field="Artist"></igx-column>
@@ -16,22 +16,24 @@
1616
<igx-column field="GrammyAwards" header="Grammy Awards" dataType="number"></igx-column>
1717

1818
<igx-row-island [height]="null" [key]="'Albums'" [autoGenerate]="false" [allowAdvancedFiltering]="true">
19-
<igx-grid-toolbar *igxGridToolbar="let childGrid"></igx-grid-toolbar>
19+
<igx-grid-toolbar *igxGridToolbar="let childGrid"></igx-grid-toolbar>
2020

2121
<igx-column field="Album"></igx-column>
2222
<igx-column field="LaunchDate" header="Launch Date" [dataType]="'date'"></igx-column>
2323
<igx-column field="BillboardReview" header="Billboard Review" dataType="number"></igx-column>
2424
<igx-column field="USBillboard200" header="US Billboard 200" dataType="number"></igx-column>
25-
<igx-row-island [height]="null" [key]="'Songs'" [autoGenerate]="false" >
25+
<igx-column field="Artist" header="Artist" [hidden]="true"></igx-column>
26+
27+
<igx-row-island [height]="null" [key]="'Songs'" [autoGenerate]="false" >
2628
<igx-column field="Number" header="No."></igx-column>
2729
<igx-column field="Title"></igx-column>
2830
<igx-column field="Released" dataType="date"></igx-column>
2931
<igx-column field="Genre"></igx-column>
30-
</igx-row-island>
32+
</igx-row-island>
3133
</igx-row-island>
3234

3335
<igx-row-island [height]="null" [key]="'Tours'" [autoGenerate]="false" [allowAdvancedFiltering]="true">
34-
<igx-grid-toolbar *igxGridToolbar="let childGrid"></igx-grid-toolbar>
36+
<igx-grid-toolbar *igxGridToolbar="let childGrid"></igx-grid-toolbar>
3537

3638
<igx-column field="Tour"></igx-column>
3739
<igx-column field="StartedOn" header="Started on"></igx-column>

src/app/hierarchical-grid/hierarchical-grid-advanced-filtering/hierarchical-grid-advanced-filtering.component.ts

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import { Component } from '@angular/core';
1+
import { Component, AfterViewInit, ViewChild, ChangeDetectorRef } from '@angular/core';
22
import { SINGERS } from '../../data/singersData';
3-
import { IgxHierarchicalGridComponent, IgxGridToolbarComponent, IgxColumnComponent, IgxCellTemplateDirective, IgxRowIslandComponent, IgxGridToolbarDirective } from 'igniteui-angular';
3+
import { IgxHierarchicalGridComponent, IgxGridToolbarComponent, IgxColumnComponent, IgxCellTemplateDirective, IgxRowIslandComponent, IgxGridToolbarDirective, FilteringExpressionsTree, IgxDateFilteringOperand, IgxStringFilteringOperand, IgxNumberFilteringOperand, FilteringLogic } from 'igniteui-angular';
44
import { IgxPreventDocumentScrollDirective } from '../../directives/prevent-scroll.directive';
55

66
@Component({
@@ -10,11 +10,33 @@ import { IgxPreventDocumentScrollDirective } from '../../directives/prevent-scro
1010
imports: [IgxHierarchicalGridComponent, IgxPreventDocumentScrollDirective, IgxGridToolbarComponent, IgxColumnComponent, IgxCellTemplateDirective, IgxRowIslandComponent, IgxGridToolbarDirective]
1111
})
1212

13-
export class HGridAdvancedFilteringSampleComponent {
14-
public localdata;
13+
export class HGridAdvancedFilteringSampleComponent implements AfterViewInit{
14+
@ViewChild('hGrid', { static: true })
15+
private hGrid: IgxHierarchicalGridComponent;
1516

16-
constructor() {
17-
this.localdata = SINGERS;
17+
public localData;
18+
19+
constructor(private cdr: ChangeDetectorRef) {
20+
this.localData = SINGERS;
21+
}
22+
23+
public ngAfterViewInit() {
24+
const albumsTree = new FilteringExpressionsTree(FilteringLogic.And, undefined, 'Albums', ['Artist']);
25+
albumsTree.filteringOperands.push({
26+
fieldName: 'LaunchDate',
27+
condition: IgxDateFilteringOperand.instance().condition('after'),
28+
conditionName: IgxDateFilteringOperand.instance().condition('after').name,
29+
searchVal: new Date(2017, 1, 1)
30+
});
31+
const tree = new FilteringExpressionsTree(FilteringLogic.And);
32+
tree.filteringOperands.push({
33+
fieldName: 'Artist',
34+
condition: IgxStringFilteringOperand.instance().condition('inQuery'),
35+
conditionName: IgxStringFilteringOperand.instance().condition('inQuery').name,
36+
searchTree: albumsTree
37+
});
38+
this.hGrid.advancedFilteringExpressionsTree = tree;
39+
this.cdr.detectChanges();
1840
}
1941

2042
public formatter = (a) => a;

src/app/hierarchical-grid/hierarchical-grid-lod/hierarchical-grid-lod.component.html

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,34 @@
11
<div class="grid__wrapper">
2-
<igx-hierarchical-grid [igxPreventDocumentScroll]="true" #hGrid [primaryKey]="'CustomerID'" [autoGenerate]="false" [height]="'580px'" [width]="'100%'">
3-
<igx-column field="CustomerID" [hidden]="true"></igx-column>
4-
<igx-column field="CompanyName"></igx-column>
5-
<igx-column field="ContactName"></igx-column>
6-
<igx-column field="ContactTitle"></igx-column>
7-
<igx-column field="Country"></igx-column>
8-
<igx-column field="Phone"></igx-column>
9-
<igx-row-island [height]="null" [key]="'Orders'" [primaryKey]="'OrderID'" [autoGenerate]="false" (gridCreated)="gridCreated($event, 'CustomerID')" [width]="'100%'">
10-
<igx-column field="OrderID" [hidden]="true"></igx-column>
11-
<igx-column field="ShipCountry"></igx-column>
12-
<igx-column field="ShipCity"></igx-column>
13-
<igx-column field="ShipAddress"></igx-column>
14-
<igx-column field="OrderDate" [formatter]="dateFormatter"></igx-column>
15-
<igx-row-island [height]="null" [key]="'Order_Details'" [primaryKey]="'ProductID'" [autoGenerate]="false" (gridCreated)="gridCreated($event, 'OrderID')">
16-
<igx-column field="ProductID" [hidden]="true"></igx-column>
17-
<igx-column field="Quantity"></igx-column>
18-
<igx-column field="UnitPrice"></igx-column>
19-
<igx-column field="Discount"></igx-column>
2+
<igx-hierarchical-grid #hGrid
3+
[data]="remoteData"
4+
[isLoading]="true"
5+
[primaryKey]="'customerId'"
6+
[autoGenerate]="false"
7+
[height]="'580px'"
8+
[width]="'100%'"
9+
[igxPreventDocumentScroll]="true"
10+
[allowAdvancedFiltering]="true"
11+
[schema]="schema"
12+
(advancedFilteringExpressionsTreeChange)="refreshRootGridData()">
13+
<igx-grid-toolbar></igx-grid-toolbar>
14+
15+
<igx-column field="customerId" [dataType]="'string'"></igx-column>
16+
<igx-column field="companyName" [dataType]="'string'"></igx-column>
17+
<igx-column field="contactName" [dataType]="'string'"></igx-column>
18+
<igx-column field="contactTitle" [dataType]="'string'"></igx-column>
19+
20+
<igx-row-island #rowIsland1 [key]="'Orders'" [primaryKey]="'orderId'" [autoGenerate]="false" (gridCreated)="gridCreated($event)">
21+
<igx-column field="orderId"></igx-column>
22+
<igx-column field="customerId"></igx-column>
23+
<igx-column field="shipVia"></igx-column>
24+
<igx-column field="freight"></igx-column>
25+
26+
<igx-row-island #rowIsland2 [key]="'Details'" [primaryKey]="'orderId'" [autoGenerate]="false" (gridCreated)="gridCreated($event)">
27+
<igx-column field="orderId"></igx-column>
28+
<igx-column field="productId"></igx-column>
29+
<igx-column field="unitPrice"></igx-column>
30+
<igx-column field="quantity"></igx-column>
31+
<igx-column field="discount"></igx-column>
2032
</igx-row-island>
2133
</igx-row-island>
2234
</igx-hierarchical-grid>
Lines changed: 92 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,66 +1,115 @@
1-
import { AfterViewInit, Component, ViewChild } from '@angular/core';
2-
import { IGridCreatedEventArgs, IgxHierarchicalGridComponent, IgxRowIslandComponent, IgxColumnComponent } from 'igniteui-angular';
3-
import { IDataState, RemoteLoDService } from '../../services/remote-lod.service';
1+
import { AfterViewInit, Component, OnInit, ViewChild } from '@angular/core';
2+
import { IGridCreatedEventArgs, IgxHierarchicalGridComponent, IgxRowIslandComponent, IgxColumnComponent, FilteringExpressionsTree, IgxNumberFilteringOperand, IgxStringFilteringOperand, EntityType, IGX_HIERARCHICAL_GRID_DIRECTIVES, FilteringLogic } from 'igniteui-angular';
43
import { IgxPreventDocumentScrollDirective } from '../../directives/prevent-scroll.directive';
4+
import { HttpClient } from '@angular/common/http';
5+
6+
const API_ENDPOINT = 'https://data-northwind.indigo.design';
57

68
@Component({
7-
providers: [RemoteLoDService],
89
selector: 'app-hierarchical-grid-lod',
910
styleUrls: ['./hierarchical-grid-lod.component.scss'],
1011
templateUrl: './hierarchical-grid-lod.component.html',
11-
imports: [IgxHierarchicalGridComponent, IgxPreventDocumentScrollDirective, IgxColumnComponent, IgxRowIslandComponent]
12+
imports: [IGX_HIERARCHICAL_GRID_DIRECTIVES, IgxHierarchicalGridComponent, IgxPreventDocumentScrollDirective, IgxColumnComponent, IgxRowIslandComponent]
1213
})
13-
export class HierarchicalGridLoDSampleComponent implements AfterViewInit {
14+
export class HierarchicalGridLoDSampleComponent implements OnInit, AfterViewInit {
1415
@ViewChild('hGrid', { static: true })
1516
public hGrid: IgxHierarchicalGridComponent;
1617

17-
constructor(private remoteService: RemoteLoDService) { }
18+
public remoteData = [];
19+
public schema: EntityType[] = [
20+
{
21+
name: 'Customers',
22+
fields: [
23+
{ field: 'customerId', dataType: 'string' },
24+
{ field: 'companyName', dataType: 'string' },
25+
{ field: 'contactName', dataType: 'string' },
26+
{ field: 'contactTitle', dataType: 'string' }
27+
],
28+
childEntities: [
29+
{
30+
name: 'Orders',
31+
fields: [
32+
{ field: 'customerId', dataType: 'string' }, // first field will be treated as foreign key
33+
{ field: 'orderId', dataType: 'number' },
34+
{ field: 'employeeId', dataType: 'number' },
35+
{ field: 'shipVia', dataType: 'string' },
36+
{ field: 'freight', dataType: 'number' }
37+
],
38+
childEntities: [
39+
{
40+
name: 'Details',
41+
fields: [
42+
{ field: 'orderId', dataType: 'number' }, // first field will be treated as foreign key
43+
{ field: 'productId', dataType: 'number' },
44+
{ field: 'unitPrice', dataType: 'number' },
45+
{ field: 'quantity', dataType: 'number' },
46+
{ field: 'discount', dataType: 'number' }
47+
]
48+
}
49+
]
50+
}
51+
]
52+
}
53+
];
54+
55+
constructor(private http: HttpClient) {}
56+
57+
public ngOnInit() {
58+
const ordersTree = new FilteringExpressionsTree(FilteringLogic.And, undefined, 'Orders', ['customerId']);
59+
ordersTree.filteringOperands.push({
60+
fieldName: 'freight',
61+
ignoreCase: false,
62+
condition: IgxNumberFilteringOperand.instance().condition('greaterThanOrEqualTo'),
63+
conditionName: IgxNumberFilteringOperand.instance().condition('greaterThanOrEqualTo').name,
64+
searchVal: '500'
65+
});
66+
67+
const customersTree = new FilteringExpressionsTree(FilteringLogic.And, undefined, 'Customers', ['customerId', 'companyName', 'contactName', 'contactTitle']);
68+
customersTree.filteringOperands.push({
69+
fieldName: 'customerId',
70+
condition: IgxStringFilteringOperand.instance().condition('inQuery'),
71+
conditionName: IgxStringFilteringOperand.instance().condition('inQuery').name,
72+
ignoreCase: false,
73+
searchTree: ordersTree
74+
});
75+
this.hGrid.advancedFilteringExpressionsTree = customersTree;
76+
}
1877

1978
public ngAfterViewInit() {
20-
const dataState: IDataState = {
21-
key: 'Customers',
22-
parentID: '',
23-
parentKey: '',
24-
rootLevel: true
25-
};
79+
this.refreshRootGridData();
80+
}
81+
82+
public refreshRootGridData() {
83+
const tree = this.hGrid.advancedFilteringExpressionsTree;
2684
this.hGrid.isLoading = true;
27-
this.remoteService.getData(dataState).subscribe(
28-
(data) => {
85+
if (tree) {
86+
this.http.post(`${API_ENDPOINT}/QueryBuilder/ExecuteQuery`, tree).subscribe(data =>{
87+
this.remoteData = Object.values(data)[0];
2988
this.hGrid.isLoading = false;
30-
this.hGrid.data = data;
3189
this.hGrid.cdr.detectChanges();
32-
},
33-
(error) => {
34-
this.hGrid.emptyGridMessage = error.message;
90+
});
91+
} else {
92+
this.http.get(`${API_ENDPOINT}/Customers`).subscribe(data => {
93+
this.remoteData = Object.values(data);
3594
this.hGrid.isLoading = false;
3695
this.hGrid.cdr.detectChanges();
37-
}
38-
);
96+
});
97+
}
3998
}
4099

41-
public dateFormatter(val: string) {
42-
return new Intl.DateTimeFormat('en-US').format(new Date(val));
100+
public gridCreated(event: IGridCreatedEventArgs) {
101+
event.grid.isLoading = true;
102+
const url = this.buildUrl(event);
103+
this.http.get(url).subscribe(data => {
104+
event.grid.data = Object.values(data);
105+
event.grid.isLoading = false;
106+
this.hGrid.cdr.detectChanges();
107+
});
43108
}
44109

45-
public gridCreated(event: IGridCreatedEventArgs, _parentKey: string) {
46-
const dataState: IDataState = {
47-
key: event.owner.key,
48-
parentID: event.parentID,
49-
parentKey: _parentKey,
50-
rootLevel: false
51-
};
52-
event.grid.isLoading = true;
53-
this.remoteService.getData(dataState).subscribe(
54-
(data) => {
55-
event.grid.isLoading = false;
56-
event.grid.data = data;
57-
event.grid.cdr.detectChanges();
58-
},
59-
(error) => {
60-
event.grid.emptyGridMessage = error.message;
61-
event.grid.isLoading = false;
62-
event.grid.cdr.detectChanges();
63-
}
64-
);
110+
private buildUrl(event: IGridCreatedEventArgs) {
111+
const parentKey = (event.grid.parent as any).key ?? this.schema[0].name;
112+
const url = `${API_ENDPOINT}/${parentKey}/${event.parentID}/${event.owner.key}`;
113+
return url;
65114
}
66115
}

0 commit comments

Comments
 (0)