Skip to content

Commit f612626

Browse files
authored
Add toolbar and paginator template inputs enhancements. Optimize paginator init. (#13942)
1 parent 6a9a8d2 commit f612626

File tree

5 files changed

+140
-11
lines changed

5 files changed

+140
-11
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ All notable changes for each version of this project will be documented in this
2525
- New directive - `igxIconButton` directive that provides a way to use an icon as a fully functional button has been added. The new `igxIconButton` comes in three types - flat, outlined and contained (default). All `igxButton`'s with type `icon` will be automatically migrated to the new `igxIconButton`'s with `ng update`.
2626
- `IgxButton`
2727
- **Behavioral Change** `buttonSelected` event is now emitted not only when a button gets selected, but also when it gets deselected. However, the event is no longer being emitted on initialization. If this event was used in a scenario where it is assumed that the button gets selected, it's a good idea the logic to be branched now based on `eventArgs.selected` condition.
28+
- `IgxRowIsland`
29+
- Added `toolbarTemplate` and `paginatorTemplate` inputs for defining `IgxGridToolbar` and `IgxPaginator` templates.
2830

2931

3032
### General

projects/igniteui-angular/src/lib/grids/common/grid.interface.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1388,6 +1388,10 @@ export interface IgxSummaryTemplateContext {
13881388
$implicit: IgxSummaryResult[]
13891389
}
13901390

1391+
export interface IgxGridPaginatorTemplateContext {
1392+
$implicit: GridType;
1393+
}
1394+
13911395
/**
13921396
* An interface describing settings for row/column pinning position.
13931397
*/

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

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import { take } from 'rxjs/operators';
1212
import {
1313
IgxHierarchicalGridTestBaseComponent,
1414
IgxHierarchicalGridTestCustomToolbarComponent,
15+
IgxHierarchicalGridTestInputPaginatorComponent,
16+
IgxHierarchicalGridTestInputToolbarComponent,
1517
IgxHierarchicalGridWithTransactionProviderComponent
1618
} from '../../test-utils/hierarchical-grid-components.spec';
1719
import { GridFunctions, GridSelectionFunctions } from '../../test-utils/grid-functions.spec';
@@ -39,7 +41,9 @@ describe('IgxHierarchicalGrid Integration #hGrid', () => {
3941
NoopAnimationsModule,
4042
IgxHierarchicalGridTestBaseComponent,
4143
IgxHierarchicalGridTestCustomToolbarComponent,
42-
IgxHierarchicalGridWithTransactionProviderComponent
44+
IgxHierarchicalGridWithTransactionProviderComponent,
45+
IgxHierarchicalGridTestInputPaginatorComponent,
46+
IgxHierarchicalGridTestInputToolbarComponent
4347
]
4448
}).compileComponents();
4549
}))
@@ -639,6 +643,21 @@ describe('IgxHierarchicalGrid Integration #hGrid', () => {
639643

640644
expect(hierarchicalGrid.hasVerticalScroll()).toBeTruthy();
641645
}));
646+
647+
it('should be displayed correctly when using the template input', fakeAsync(() => {
648+
fixture = TestBed.createComponent(IgxHierarchicalGridTestInputPaginatorComponent);
649+
tick();
650+
fixture.detectChanges();
651+
hierarchicalGrid = fixture.componentInstance.hgrid;
652+
653+
hierarchicalGrid.expandRow(hierarchicalGrid.dataRowList.first.key);
654+
tick(DEBOUNCE_TIME);
655+
fixture.detectChanges();
656+
657+
const paginators = fixture.debugElement.queryAll(By.css('igx-paginator'));
658+
expect(paginators[0].query(By.css('button')).nativeElement.innerText.trim()).toEqual('childData1 Button');
659+
expect(paginators[1].query(By.css('button')).nativeElement.innerText.trim()).toEqual('childData2 Button');
660+
}))
642661
});
643662

644663
describe('Hiding', () => {
@@ -774,6 +793,21 @@ describe('IgxHierarchicalGrid Integration #hGrid', () => {
774793
const toolbar = fixture.debugElement.query(By.css('igx-grid-toolbar'));
775794
expect(toolbar.nativeElement.offsetWidth).toEqual(hierarchicalGrid.nativeElement.offsetWidth);
776795
}));
796+
797+
it('should be displayed correctly when using the template input', fakeAsync(() => {
798+
fixture = TestBed.createComponent(IgxHierarchicalGridTestInputToolbarComponent);
799+
tick();
800+
fixture.detectChanges();
801+
hierarchicalGrid = fixture.componentInstance.hgrid;
802+
803+
hierarchicalGrid.expandRow(hierarchicalGrid.dataRowList.first.key);
804+
tick(DEBOUNCE_TIME);
805+
fixture.detectChanges();
806+
807+
const toolbars = fixture.debugElement.queryAll(By.css('igx-grid-toolbar'));
808+
expect(toolbars[1].query(By.css('button')).nativeElement.innerText.trim()).toEqual('childData1 Button');
809+
expect(toolbars[2].query(By.css('button')).nativeElement.innerText.trim()).toEqual('childData2 Button');
810+
}))
777811
});
778812

779813
describe('Moving', () => {

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

Lines changed: 51 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,15 @@ import { IgxColumnComponent } from '../columns/column.component';
4141
import { IgxRowIslandAPIService } from './row-island-api.service';
4242
import { PlatformUtil } from '../../core/utils';
4343
import { IgxColumnResizingService } from '../resizing/resizing.service';
44-
import { GridType, IGX_GRID_SERVICE_BASE } from '../common/grid.interface';
44+
import { GridType, IGX_GRID_SERVICE_BASE, IgxGridPaginatorTemplateContext } from '../common/grid.interface';
4545
import { IgxGridToolbarDirective, IgxGridToolbarTemplateContext } from '../toolbar/common';
4646
import { IgxActionStripToken } from '../../action-strip/token';
4747
import { IgxPaginatorDirective } from '../../paginator/paginator-interfaces';
4848
import { IgxFlatTransactionFactory } from '../../services/transaction/transaction-factory.service';
4949
import { IGridCreatedEventArgs } from './events';
5050
import { IgxGridValidationService } from '../grid/grid-validation.service';
5151
import { IgxTextHighlightService } from '../../directives/text-highlight/text-highlight.service';
52+
import { IgxPaginatorComponent } from '../../paginator/paginator.component';
5253

5354
@Component({
5455
changeDetection: ChangeDetectionStrategy.OnPush,
@@ -90,15 +91,47 @@ export class IgxRowIslandComponent extends IgxHierarchicalGridBaseDirective
9091
@ContentChildren(IgxColumnComponent, { read: IgxColumnComponent, descendants: false })
9192
public childColumns = new QueryList<IgxColumnComponent>();
9293

94+
/**
95+
* @hidden
96+
* @internal
97+
*/
9398
@ContentChild(IgxGridToolbarDirective, { read: TemplateRef })
94-
public islandToolbarTemplate: TemplateRef<IgxGridToolbarTemplateContext>;
99+
protected toolbarDirectiveTemplate: TemplateRef<IgxGridToolbarTemplateContext>;
95100

101+
/**
102+
* @hidden
103+
* @internal
104+
*/
96105
@ContentChild(IgxPaginatorDirective, { read: TemplateRef })
97-
public islandPaginatorTemplate: TemplateRef<any>;
106+
protected paginatorDirectiveTemplate: TemplateRef<any>;
107+
108+
/**
109+
* Sets/Gets the toolbar template for each child grid created from this row island.
110+
*/
111+
@Input()
112+
public get toolbarTemplate(): TemplateRef<IgxGridToolbarTemplateContext> {
113+
return this._toolbarTemplate || this.toolbarDirectiveTemplate;
114+
}
115+
116+
public set toolbarTemplate(template: TemplateRef<IgxGridToolbarTemplateContext>) {
117+
this._toolbarTemplate = template;
118+
}
119+
120+
/**
121+
* Sets/Gets the paginator template for each child grid created from this row island.
122+
*/
123+
@Input()
124+
public get paginatorTemplate(): TemplateRef<IgxGridPaginatorTemplateContext> {
125+
return this._paginatorTemplate || this.paginatorDirectiveTemplate;
126+
}
127+
128+
public set paginatorTemplate(template: TemplateRef<IgxGridPaginatorTemplateContext>) {
129+
this._paginatorTemplate = template;
130+
}
98131

99132
/** @hidden @internal **/
100133
@ContentChildren(IgxActionStripToken, { read: IgxActionStripToken, descendants: false })
101-
public actionStrips: QueryList<IgxActionStripToken>;
134+
protected actionStrips: QueryList<IgxActionStripToken>;
102135

103136
/**
104137
* @hidden
@@ -151,6 +184,8 @@ export class IgxRowIslandComponent extends IgxHierarchicalGridBaseDirective
151184
private ri_columnListDiffer;
152185
private layout_id = `igx-row-island-`;
153186
private isInit = false;
187+
private _toolbarTemplate: TemplateRef<IgxGridToolbarTemplateContext>;
188+
private _paginatorTemplate: TemplateRef<IgxGridPaginatorTemplateContext>;
154189

155190
/**
156191
* Sets if all immediate children of the grids for this `IgxRowIslandComponent` should be expanded/collapsed.
@@ -333,12 +368,19 @@ export class IgxRowIslandComponent extends IgxHierarchicalGridBaseDirective
333368

334369
// Create the child toolbar if the parent island has a toolbar definition
335370
this.gridCreated.pipe(pluck('grid'), takeUntil(this.destroy$)).subscribe(grid => {
336-
grid.rendered$.pipe(first(), filter(() => !!this.islandToolbarTemplate))
337-
.subscribe(() => grid.toolbarOutlet.createEmbeddedView(this.islandToolbarTemplate, { $implicit: grid }, { injector: grid.toolbarOutlet.injector }));
338-
grid.rendered$.pipe(first(), filter(() => !!this.islandPaginatorTemplate))
371+
grid.rendered$.pipe(first(), filter(() => !!this.toolbarTemplate))
372+
.subscribe(() => grid.toolbarOutlet.createEmbeddedView(this.toolbarTemplate, { $implicit: grid }, { injector: grid.toolbarOutlet.injector }));
373+
grid.rendered$.pipe(first(), filter(() => !!this.paginatorTemplate))
339374
.subscribe(() => {
340-
this.rootGrid.paginatorList.changes.pipe(takeUntil(this.destroy$)).subscribe(() => grid.setUpPaginator());
341-
grid.paginatorOutlet.createEmbeddedView(this.islandPaginatorTemplate);
375+
this.rootGrid.paginatorList.changes.pipe(takeUntil(this.destroy$)).subscribe((changes: QueryList<IgxPaginatorComponent>) => {
376+
changes.forEach(p => {
377+
if (p.nativeElement.offsetParent?.id === grid.id) {
378+
// Optimize update only for those grids that have related changed paginator.
379+
grid.setUpPaginator()
380+
}
381+
});
382+
});
383+
grid.paginatorOutlet.createEmbeddedView(this.paginatorTemplate, { $implicit: grid });
342384
});
343385
});
344386
}

projects/igniteui-angular/src/lib/test-utils/hierarchical-grid-components.spec.ts

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { IgxHierarchicalTransactionServiceFactory } from '../grids/hierarchical-
1111
import { IgxGridToolbarComponent } from '../grids/toolbar/grid-toolbar.component';
1212
import { IgxButtonDirective } from '../directives/button/button.directive';
1313
import { IgxCheckboxComponent } from '../checkbox/checkbox.component';
14-
import { IgxPaginatorComponent } from '../paginator/paginator.component';
14+
import { IgxPaginatorComponent, IgxPaginatorContentDirective } from '../paginator/paginator.component';
1515
import { IgxColumnGroupComponent } from '../grids/columns/column-group.component';
1616
import { IgxIconComponent } from '../icon/icon.component';
1717
import { IgxHeadSelectorDirective, IgxRowSelectorDirective } from '../grids/selection/row-selectors';
@@ -370,6 +370,53 @@ export class IgxHierarchicalGridCustomSelectorsComponent implements OnInit {
370370
})
371371
export class IgxHierarchicalGridTestCustomToolbarComponent extends IgxHierarchicalGridTestBaseComponent { }
372372

373+
@Component({
374+
template: `
375+
<igx-hierarchical-grid #grid1 [data]="data" [height]="'600px'" [width]="'700px'" #hierarchicalGrid
376+
[primaryKey]="'ID'" [autoGenerate]="true">
377+
<igx-grid-toolbar>
378+
<button type="button" igxButton="contained">Parent Button</button>
379+
</igx-grid-toolbar>
380+
<ng-template #toolbarTemplate let-grid>
381+
<igx-grid-toolbar>
382+
<button type="button" igxButton="contained"> {{grid.parentIsland.key}} Button</button>
383+
</igx-grid-toolbar>
384+
</ng-template>
385+
<igx-row-island [key]="'childData1'" #rowIsland1 [primaryKey]="'ID'" [autoGenerate]="true" [toolbarTemplate]="toolbarTemplate">
386+
</igx-row-island>
387+
<igx-row-island [key]="'childData2'" #rowIsland2 [primaryKey]="'ID'" [autoGenerate]="true" [toolbarTemplate]="toolbarTemplate">
388+
</igx-row-island>
389+
390+
</igx-hierarchical-grid>`,
391+
standalone: true,
392+
imports: [IgxHierarchicalGridComponent, IgxGridToolbarComponent, IgxGridToolbarDirective, IgxRowIslandComponent, IgxButtonDirective]
393+
})
394+
export class IgxHierarchicalGridTestInputToolbarComponent extends IgxHierarchicalGridTestBaseComponent { }
395+
396+
@Component({
397+
template: `
398+
<igx-hierarchical-grid #grid1 [data]="data" [height]="'600px'" [width]="'700px'" #hierarchicalGrid
399+
[primaryKey]="'ID'" [autoGenerate]="true">
400+
<igx-grid-toolbar>
401+
<button type="button" igxButton="contained">Parent Button</button>
402+
</igx-grid-toolbar>
403+
<ng-template #paginatorTemplate let-grid>
404+
<igx-paginator>
405+
<igx-paginator-content>
406+
<button type="button" igxButton="contained"> {{grid.parentIsland.key}} Button</button>
407+
</igx-paginator-content>
408+
</igx-paginator>
409+
</ng-template>
410+
<igx-row-island [key]="'childData1'" #rowIsland1 [primaryKey]="'ID'" [autoGenerate]="true" [paginatorTemplate]="paginatorTemplate">
411+
</igx-row-island>
412+
<igx-row-island [key]="'childData2'" #rowIsland2 [primaryKey]="'ID'" [autoGenerate]="true" [paginatorTemplate]="paginatorTemplate">
413+
</igx-row-island>
414+
</igx-hierarchical-grid>`,
415+
standalone: true,
416+
imports: [IgxHierarchicalGridComponent, IgxGridToolbarComponent, IgxPaginatorComponent, IgxPaginatorContentDirective, IgxRowIslandComponent, IgxButtonDirective]
417+
})
418+
export class IgxHierarchicalGridTestInputPaginatorComponent extends IgxHierarchicalGridTestBaseComponent { }
419+
373420
@Component({
374421
template: `
375422
<igx-hierarchical-grid #grid1 [data]="data" [height]="'600px'" [width]="'700px'" #hierarchicalGrid

0 commit comments

Comments
 (0)