Skip to content

Commit f8fedf1

Browse files
committed
feat(grid-toolbar): Hierarchical grid implementation
Closes #8055
1 parent 99adc04 commit f8fedf1

File tree

8 files changed

+88
-61
lines changed

8 files changed

+88
-61
lines changed

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

-5
Original file line numberDiff line numberDiff line change
@@ -4735,11 +4735,6 @@ export abstract class IgxGridBaseDirective extends DisplayDensityBase implements
47354735
if (this.toolbar.first) {
47364736
toolbarHeight = this.getComputedHeight(this.toolbar.first.nativeElement);
47374737
}
4738-
// if (this.showToolbar && this.toolbarHtml != null) {
4739-
// const height = this.getComputedHeight(this.toolbarHtml.nativeElement);
4740-
// toolbarHeight = this.toolbarHtml.nativeElement.firstElementChild ?
4741-
// height : 0;
4742-
// }
47434738
return toolbarHeight;
47444739
}
47454740

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

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Component, DebugElement, ViewChild } from '@angular/core';
2-
import { TestBed, fakeAsync, async, tick, ComponentFixture } from '@angular/core/testing';
2+
import { TestBed, fakeAsync, tick, ComponentFixture, waitForAsync } from '@angular/core/testing';
33
import { By } from '@angular/platform-browser';
44
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
55
import { first } from 'rxjs/operators';
@@ -9,7 +9,6 @@ import { IgxButtonDirective } from '../../directives/button/button.directive';
99
import { IgxGridComponent } from './grid.component';
1010
import { IgxGridModule } from './public_api';
1111
import { DisplayDensity } from '../../core/displayDensity';
12-
import { UIInteractions } from '../../test-utils/ui-interactions.spec';
1312
import { configureTestSuite } from '../../test-utils/configure-suite';
1413
import { GridFunctions } from '../../test-utils/grid-functions.spec';
1514

@@ -25,7 +24,7 @@ describe('IgxGrid - Grid Toolbar #grid - ', () => {
2524
configureTestSuite();
2625
let grid: IgxGridComponent;
2726

28-
beforeAll(async(() => {
27+
beforeAll(waitForAsync(() => {
2928
TestBed.configureTestingModule({
3029
declarations: [
3130
GridToolbarTestPage1Component,

projects/igniteui-angular/src/lib/grids/hierarchical-grid/hierarchical-grid.component.html

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
<igx-grid-toolbar role="toolbar" [style.max-width.px]='outerWidth' [style.flex-basis.px]="outerWidth" *ngIf="showToolbar" [gridID]="id"
2-
[displayDensity]="displayDensity" #toolbar>
3-
</igx-grid-toolbar>
1+
<ng-container *ngTemplateOutlet="toolbarTemplate; context: { $implicit: this }"></ng-container>
2+
43

54
<div class="igx-grid__thead">
65
<div class="igx-grid__thead-wrapper" tabindex="0" (focus)="navigation.focusFirstCell()" [attr.aria-activedescendant]="activeDescendant"

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

+14-11
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,28 @@
11
import {
2+
AfterContentInit,
3+
AfterViewInit,
24
ChangeDetectionStrategy,
35
Component,
6+
ContentChild,
7+
ContentChildren,
8+
DoCheck,
9+
ElementRef,
10+
forwardRef,
411
HostBinding,
512
Input,
6-
forwardRef,
13+
OnDestroy,
14+
OnInit,
15+
QueryList,
716
TemplateRef,
817
ViewChild,
9-
ViewChildren,
10-
QueryList,
11-
ContentChildren,
12-
ElementRef,
13-
AfterViewInit,
14-
AfterContentInit,
15-
OnInit,
16-
OnDestroy,
17-
DoCheck
18+
ViewChildren
1819
} from '@angular/core';
1920
import { IgxGridBaseDirective } from '../grid-base.directive';
2021
import { GridBaseAPIService } from '../api.service';
2122
import { IgxHierarchicalGridAPIService } from './hierarchical-grid-api.service';
2223
import { IgxRowIslandComponent } from './row-island.component';
2324
import { IgxChildGridRowComponent } from './child-grid-row.component';
2425
import { IgxFilteringService } from '../filtering/grid-filtering.service';
25-
import { DisplayDensity } from '../../core/displayDensity';
2626
import { IgxColumnComponent, } from '../columns/column.component';
2727
import { IgxHierarchicalGridNavigationService } from './hierarchical-grid-navigation.service';
2828
import { IgxGridSummaryService } from '../summaries/grid-summary.service';
@@ -34,6 +34,7 @@ import { IgxTransactionService } from '../../services/public_api';
3434
import { IgxForOfSyncService, IgxForOfScrollSyncService } from '../../directives/for-of/for_of.sync.service';
3535
import { GridType } from '../common/grid.interface';
3636
import { IgxRowIslandAPIService } from './row-island-api.service';
37+
import { IgxGridToolbarDirective, IgxGridToolbarTemplateContext } from '../toolbar/common';
3738

3839
let NEXT_ID = 0;
3940

@@ -220,6 +221,8 @@ export class IgxHierarchicalGridComponent extends IgxHierarchicalGridBaseDirecti
220221
@ViewChild('headerHierarchyExpander', { read: ElementRef, static: true })
221222
protected headerHierarchyExpander: ElementRef;
222223

224+
@ContentChild(IgxGridToolbarDirective, { read: TemplateRef, static: true })
225+
public toolbarTemplate: TemplateRef<IgxGridToolbarTemplateContext>;
223226
/**
224227
* @hidden
225228
*/

projects/igniteui-angular/src/lib/grids/hierarchical-grid/row-island.component.ts

+42-34
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,28 @@
11
import {
22
AfterContentInit,
3+
AfterViewInit,
34
ChangeDetectionStrategy,
5+
ChangeDetectorRef,
46
Component,
7+
ComponentFactoryResolver,
8+
ContentChild,
59
ContentChildren,
6-
Input,
7-
QueryList,
8-
OnInit,
9-
Inject,
10+
DoCheck,
1011
ElementRef,
11-
ChangeDetectorRef,
12-
ComponentFactoryResolver,
12+
EventEmitter,
13+
Inject,
14+
Input,
15+
IterableChangeRecord,
1316
IterableDiffers,
14-
ViewContainerRef,
1517
NgZone,
16-
AfterViewInit,
1718
OnChanges,
18-
Output,
19-
EventEmitter,
20-
Optional,
2119
OnDestroy,
22-
DoCheck,
23-
IterableChangeRecord
20+
OnInit,
21+
Optional,
22+
Output,
23+
QueryList,
24+
TemplateRef,
25+
ViewContainerRef
2426
} from '@angular/core';
2527
import { IgxHierarchicalGridComponent } from './hierarchical-grid.component';
2628
import { IgxGridTransaction, IgxGridBaseDirective } from '../grid-base.directive';
@@ -29,19 +31,18 @@ import { IgxHierarchicalGridAPIService } from './hierarchical-grid-api.service';
2931
import { DOCUMENT } from '@angular/common';
3032
import { IgxFilteringService } from '../filtering/grid-filtering.service';
3133
import { IDisplayDensityOptions, DisplayDensityToken } from '../../core/displayDensity';
32-
import { TransactionService, Transaction, State } from '../../services/public_api';
3334
import { IgxGridSummaryService } from '../summaries/grid-summary.service';
3435
import { IgxHierarchicalGridBaseDirective } from './hierarchical-grid-base.directive';
3536
import { IgxHierarchicalGridNavigationService } from './hierarchical-grid-navigation.service';
3637
import { IgxGridSelectionService, IgxGridCRUDService } from '../selection/selection.service';
37-
3838
import { IgxOverlayService } from '../../services/public_api';
3939
import { takeUntil } from 'rxjs/operators';
4040
import { IgxColumnComponent } from '../columns/column.component';
4141
import { IgxRowIslandAPIService } from './row-island-api.service';
4242
import { IBaseEventArgs } from '../../core/utils';
4343
import { IgxColumnResizingService } from '../resizing/resizing.service';
4444
import { GridType } from '../common/grid.interface';
45+
import { IgxGridToolbarDirective, IgxGridToolbarTemplateContext } from '../toolbar/common';
4546
export interface IGridCreatedEventArgs extends IBaseEventArgs {
4647
owner: IgxRowIslandComponent;
4748
parentID: any;
@@ -53,10 +54,10 @@ export interface IGridCreatedEventArgs extends IBaseEventArgs {
5354
selector: 'igx-row-island',
5455
template: ``,
5556
providers: [IgxRowIslandAPIService,
56-
IgxGridSelectionService]
57+
IgxGridSelectionService]
5758
})
5859
export class IgxRowIslandComponent extends IgxHierarchicalGridBaseDirective
59-
implements AfterContentInit, AfterViewInit, OnChanges, OnInit, OnDestroy, DoCheck {
60+
implements AfterContentInit, AfterViewInit, OnChanges, OnInit, OnDestroy, DoCheck {
6061
/**
6162
* Sets the key of the row island by which child data would be taken from the row data if such is provided.
6263
* ```html
@@ -84,7 +85,7 @@ export class IgxRowIslandComponent extends IgxHierarchicalGridBaseDirective
8485
*/
8586
@Input()
8687
set expandChildren(value: boolean) {
87-
this._defaultExpandState = value;
88+
this._defaultExpandState = value;
8889
this.rowIslandAPI.getChildGrids().forEach((grid) => {
8990
if (document.body.contains(grid.nativeElement)) {
9091
// Detect changes right away if the grid is visible
@@ -120,6 +121,9 @@ export class IgxRowIslandComponent extends IgxHierarchicalGridBaseDirective
120121
@ContentChildren(IgxColumnComponent, { read: IgxColumnComponent, descendants: false })
121122
public childColumns = new QueryList<IgxColumnComponent>();
122123

124+
@ContentChild(IgxGridToolbarDirective, { read: TemplateRef })
125+
public islandToolbarTemplate: TemplateRef<IgxGridToolbarTemplateContext>;
126+
123127
/**
124128
* @hidden
125129
*/
@@ -160,14 +164,14 @@ export class IgxRowIslandComponent extends IgxHierarchicalGridBaseDirective
160164
*/
161165
get id() {
162166
const pId = this.parentId ? this.parentId.substring(this.parentId.indexOf(this.layout_id) + this.layout_id.length) + '-' : '';
163-
return this.layout_id + pId + this.key;
167+
return this.layout_id + pId + this.key;
164168
}
165169

166170
/**
167171
* @hidden
168172
*/
169173
get parentId() {
170-
return this.parentIsland ? this.parentIsland.id : null;
174+
return this.parentIsland ? this.parentIsland.id : null;
171175
}
172176

173177
/**
@@ -259,16 +263,20 @@ export class IgxRowIslandComponent extends IgxHierarchicalGridBaseDirective
259263
* @hidden
260264
*/
261265
ngAfterContentInit() {
266+
// TODO: Discuss should it always take the parent toolbar if present
267+
this.onGridCreated.pipe(takeUntil(this.destroy$)).subscribe(e => {
268+
e.grid.toolbarTemplate = this.islandToolbarTemplate || e.grid.parent.toolbarTemplate;
269+
});
262270
this.updateChildren();
263271
this.children.notifyOnChanges();
264272
this.children.changes.pipe(takeUntil(this.destroy$))
265-
.subscribe((change) => {
266-
this.updateChildren();
267-
// update existing grids since their child ri have been changed.
268-
this.getGridsForIsland(this.key).forEach(grid => {
269-
(grid as any).onRowIslandChange(this.children);
273+
.subscribe((change) => {
274+
this.updateChildren();
275+
// update existing grids since their child ri have been changed.
276+
this.getGridsForIsland(this.key).forEach(grid => {
277+
(grid as any).onRowIslandChange(this.children);
278+
});
270279
});
271-
});
272280
const nestedColumns = this.children.map((layout) => layout.columnList.toArray());
273281
const colsArray = [].concat.apply([], nestedColumns);
274282
const topCols = this.columnList.filter((item) => {
@@ -279,19 +287,19 @@ export class IgxRowIslandComponent extends IgxHierarchicalGridBaseDirective
279287
Promise.resolve().then(() => {
280288
this.updateColumnList();
281289
});
282-
});
290+
});
283291

284-
// handle column changes so that they are passed to child grid instances when onColumnChange is emitted.
285-
this.ri_columnListDiffer.diff(this.childColumns);
286-
this.childColumns.toArray().forEach(x => x.onColumnChange.pipe(takeUntil(x.destroy$)).subscribe(() => this.updateColumnList()));
287-
this.childColumns.changes.pipe(takeUntil(this.destroy$)).subscribe((change: QueryList<IgxColumnComponent> ) => {
292+
// handle column changes so that they are passed to child grid instances when onColumnChange is emitted.
293+
this.ri_columnListDiffer.diff(this.childColumns);
294+
this.childColumns.toArray().forEach(x => x.onColumnChange.pipe(takeUntil(x.destroy$)).subscribe(() => this.updateColumnList()));
295+
this.childColumns.changes.pipe(takeUntil(this.destroy$)).subscribe((change: QueryList<IgxColumnComponent>) => {
288296
const diff = this.ri_columnListDiffer.diff(change);
289297
if (diff) {
290298
diff.forEachAddedItem((record: IterableChangeRecord<IgxColumnComponent>) => {
291299
record.item.onColumnChange.pipe(takeUntil(record.item.destroy$)).subscribe(() => this.updateColumnList());
292300
});
293301
}
294-
});
302+
});
295303
}
296304

297305
protected updateChildren() {
@@ -358,12 +366,12 @@ export class IgxRowIslandComponent extends IgxHierarchicalGridBaseDirective
358366
/**
359367
* @hidden
360368
*/
361-
reflow() {}
369+
reflow() { }
362370

363371
/**
364372
* @hidden
365373
*/
366-
calculateGridHeight() {}
374+
calculateGridHeight() { }
367375

368376
protected updateColumnList() {
369377
const nestedColumns = this.children.map((layout) => layout.columnList.toArray());

projects/igniteui-angular/src/lib/grids/toolbar/common.ts

+11-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
import { Directive, Input } from '@angular/core';
1+
import { Directive, TemplateRef } from '@angular/core';
22
import { GridBaseAPIService } from '../api.service';
33
import { IgxGridBaseDirective } from '../grid-base.directive';
4+
import { IgxHierarchicalGridComponent } from '../hierarchical-grid/public_api';
45
import { GridType } from '../common/grid.interface';
56
import { IgxToggleDirective } from '../../directives/toggle/toggle.directive';
67
import {
@@ -52,6 +53,15 @@ export class IgxGridToolbarTitleDirective { }
5253
@Directive({ selector: '[igxGridToolbarActions],igx-grid-toolbar-actions' })
5354
export class IgxGridToolbarActionsDirective { }
5455

56+
export interface IgxGridToolbarTemplateContext {
57+
$implicit: IgxHierarchicalGridComponent;
58+
}
59+
60+
@Directive({ selector: '[igxGridToolbar]'})
61+
export class IgxGridToolbarDirective {
62+
constructor(public template: TemplateRef<IgxGridToolbarTemplateContext>) {}
63+
}
64+
5565
/**
5666
* Base class for the pinning/hiding column actions.
5767
*

projects/igniteui-angular/src/lib/grids/toolbar/toolbar.module.ts

+5-2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
IgxCSVTextDirective,
1313
IgxExcelTextDirective,
1414
IgxGridToolbarActionsDirective,
15+
IgxGridToolbarDirective,
1516
IgxGridToolbarTitleDirective
1617
} from './common';
1718

@@ -27,7 +28,8 @@ import {
2728
IgxGridToolbarExporterComponent,
2829
IgxGridToolbarHidingComponent,
2930
IgxGridToolbarPinningComponent,
30-
IgxGridToolbarTitleDirective
31+
IgxGridToolbarTitleDirective,
32+
IgxGridToolbarDirective
3133
],
3234
imports: [
3335
IgxColumnActionsModule,
@@ -44,7 +46,8 @@ import {
4446
IgxGridToolbarExporterComponent,
4547
IgxGridToolbarHidingComponent,
4648
IgxGridToolbarPinningComponent,
47-
IgxGridToolbarTitleDirective
49+
IgxGridToolbarTitleDirective,
50+
IgxGridToolbarDirective
4851
]
4952
})
5053
export class IgxGridToolbarModule {}

src/app/hierarchical-grid-remote/hierarchical-grid-remote.sample.html

+12-2
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,23 @@
1-
<button (click)='setterBindingChange()'>Set rowSelection via binding</button>
2-
<button (click)='setterChange()'>Set rowSelection via setter on 1st row island</button>
1+
<!-- <button (click)='setterBindingChange()'>Set rowSelection via binding</button>
2+
<button (click)='setterChange()'>Set rowSelection via setter on 1st row island</button> -->
33
<igx-hierarchical-grid #grid1 displayDensity="cosy" [data]="remoteData" [isLoading]="true" [primaryKey]="'CustomerID'" [autoGenerate]="false" [height]="'800px'" [width]="'100%'" #hGrid [emptyGridMessage]="''">
4+
<igx-grid-toolbar *igxGridToolbar>
5+
<igx-grid-toolbar-title>Parent Toolbar</igx-grid-toolbar-title>
6+
<igx-grid-toolbar-actions></igx-grid-toolbar-actions>
7+
</igx-grid-toolbar>
48
<igx-column field="CustomerID"></igx-column>
59
<igx-column field="CompanyName"></igx-column>
610
<igx-column field="ContactName"></igx-column>
711
<igx-column field="ContactTitle"></igx-column>
812
<igx-column field="Country"></igx-column>
913
<igx-column field="Phone"></igx-column>
1014
<igx-row-island #rowIsland1 [key]="'Orders'" [isLoading]="true" [primaryKey]="'OrderID'" [autoGenerate]="false" [rowSelection]='selectionMode' (onGridCreated)="gridCreated($event, rowIsland1)" [emptyGridMessage]="''">
15+
<igx-grid-toolbar *igxGridToolbar="let grid">
16+
<igx-grid-toolbar-title>Child Toolbar - Level {{ grid.parentIsland.level }}</igx-grid-toolbar-title>
17+
<igx-grid-toolbar-actions>
18+
<igx-grid-toolbar-pinning></igx-grid-toolbar-pinning>
19+
</igx-grid-toolbar-actions>
20+
</igx-grid-toolbar>
1121
<igx-column field="OrderID"></igx-column>
1222
<igx-column field="OrderDate"></igx-column>
1323
<igx-column field="ShipCountry"></igx-column>

0 commit comments

Comments
 (0)