Skip to content

Commit f6666c2

Browse files
authored
Merge pull request #10110 from IgniteUI/rkaraivanov/row-classes-bindings
perf(grid-rows): Cleaned row style bindings
2 parents 6d01e48 + 25f208f commit f6666c2

File tree

7 files changed

+65
-67
lines changed

7 files changed

+65
-67
lines changed

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

Lines changed: 58 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,16 @@ import { GridType } from './grid.interface';
77
import { IgxColumnComponent } from '../columns/column.component';
88
import { ColumnDisplayOrder } from './enums';
99
import { IgxColumnActionsComponent } from '../column-actions/column-actions.component';
10-
import { IgxGridRow, IgxSummaryOperand, IgxSummaryResult } from '../grid/public_api';
1110
import { IgxAddRow } from './crud.service';
11+
import { IgxGridRow } from '../grid-public-row';
12+
import { IgxTreeGridRowComponent } from '../tree-grid/tree-grid-row.component';
13+
import { IgxGridRowComponent } from '../grid/grid-row.component';
14+
import { IgxHierarchicalRowComponent } from '../hierarchical-grid/hierarchical-row.component';
15+
import { IgxSummaryOperand, IgxSummaryResult } from '../summaries/grid-summary';
16+
17+
interface CSSProp {
18+
[prop: string]: any;
19+
}
1220

1321
/**
1422
* @hidden
@@ -19,7 +27,7 @@ import { IgxAddRow } from './crud.service';
1927
})
2028
export class IgxGridCellStyleClassesPipe implements PipeTransform {
2129

22-
public transform(cssClasses: { [prop: string]: any }, _: any, data: any, field: string, index: number, __: number): string {
30+
public transform(cssClasses: CSSProp, _: any, data: any, field: string, index: number, __: number): string {
2331
if (!cssClasses) {
2432
return '';
2533
}
@@ -48,8 +56,7 @@ export class IgxGridCellStyleClassesPipe implements PipeTransform {
4856
})
4957
export class IgxGridCellStylesPipe implements PipeTransform {
5058

51-
public transform(styles: { [prop: string]: any }, _: any, data: any, field: string, index: number, __: number):
52-
{ [prop: string]: any } {
59+
public transform(styles: CSSProp, _: any, data: any, field: string, index: number, __: number): CSSProp {
5360
const css = {};
5461
if (!styles) {
5562
return css;
@@ -64,53 +71,81 @@ export class IgxGridCellStylesPipe implements PipeTransform {
6471
}
6572
}
6673

74+
type _RowType = IgxGridRowComponent | IgxTreeGridRowComponent | IgxHierarchicalRowComponent;
75+
6776
/**
6877
* @hidden
6978
* @internal
7079
*/
71-
@Pipe({
72-
name: 'igxGridRowClasses'
73-
})
80+
@Pipe({ name: 'igxGridRowClasses' })
7481
export class IgxGridRowClassesPipe implements PipeTransform {
82+
public row: IgxGridRow;
7583

76-
constructor(private gridAPI: GridBaseAPIService<IgxGridBaseDirective & GridType>) { }
84+
constructor(private gridAPI: GridBaseAPIService<IgxGridBaseDirective & GridType>) {
85+
this.row = new IgxGridRow(this.gridAPI.grid as any, -1, {});
86+
}
7787

78-
public transform(cssClasses: { [prop: string]: any }, rowData: any, index: number, __: number): string {
79-
if (!cssClasses) {
80-
return '';
88+
public transform(
89+
cssClasses: CSSProp,
90+
row: _RowType,
91+
editMode: boolean,
92+
selected: boolean,
93+
dirty: boolean,
94+
deleted: boolean,
95+
dragging: boolean,
96+
index: number,
97+
mrl: boolean,
98+
filteredOut: boolean,
99+
_: number
100+
) {
101+
const result = new Set(['igx-grid__tr', index % 2 ? row.grid.evenRowCSS : row.grid.oddRowCSS]);
102+
const mapping = [
103+
[selected, 'igx-grid__tr--selected'],
104+
[editMode, 'igx-grid__tr--edit'],
105+
[dirty, 'igx-grid__tr--edited'],
106+
[deleted, 'igx-grid__tr--deleted'],
107+
[dragging, 'igx-grid__tr--drag'],
108+
[mrl, 'igx-grid__tr--mrl'],
109+
// Tree grid only
110+
[filteredOut, 'igx-grid__tr--filtered']
111+
];
112+
113+
for (const [state, _class] of mapping) {
114+
if (state) {
115+
result.add(_class as string);
116+
}
81117
}
82-
const result = [];
83-
for (const cssClass of Object.keys(cssClasses)) {
118+
119+
for (const cssClass of Object.keys(cssClasses ?? {})) {
84120
const callbackOrValue = cssClasses[cssClass];
85-
const row = new IgxGridRow((this.gridAPI.grid as any), index, rowData);
86-
const apply = typeof callbackOrValue === 'function' ? callbackOrValue(row) : callbackOrValue;
121+
this.row.index = index;
122+
(this.row as any)._data = row.rowData;
123+
const apply = typeof callbackOrValue === 'function' ? callbackOrValue(this.row) : callbackOrValue;
87124
if (apply) {
88-
result.push(cssClass);
125+
result.add(cssClass);
89126
}
90127
}
91-
return result.join(' ');
128+
return result;
92129
}
93130
}
94131

95132
/**
96133
* @hidden
97134
* @internal
98135
*/
99-
@Pipe({
100-
name: 'igxGridRowStyles'
101-
})
136+
@Pipe({ name: 'igxGridRowStyles' })
102137
export class IgxGridRowStylesPipe implements PipeTransform {
103138

104139
constructor(private gridAPI: GridBaseAPIService<IgxGridBaseDirective & GridType>) { }
105140

106-
public transform(styles: { [prop: string]: any }, rowData: any, index: number, __: number): { [prop: string]: any } {
141+
public transform(styles: CSSProp, rowData: any, index: number, __: number): CSSProp {
107142
const css = {};
108143
if (!styles) {
109144
return css;
110145
}
111146
for (const prop of Object.keys(styles)) {
112147
const cb = styles[prop];
113-
const row = new IgxGridRow((this.gridAPI.grid as any), index, rowData);
148+
const row = new IgxGridRow((this.gridAPI.grid as any), index, rowData);
114149
css[prop] = typeof cb === 'function' ? cb(row) : cb;
115150
}
116151
return css;
@@ -394,7 +429,7 @@ export class IgxGridAddRowPipe implements PipeTransform {
394429
@Pipe({ name: 'igxHeaderGroupWidth' })
395430
export class IgxHeaderGroupWidthPipe implements PipeTransform {
396431

397-
public transform(width: any, minWidth: any, hasLayout: boolean ) {
432+
public transform(width: any, minWidth: any, hasLayout: boolean) {
398433
return hasLayout ? '' : `${Math.max(parseFloat(width), minWidth)}px`;
399434
}
400435
}

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

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Component, forwardRef, ChangeDetectionStrategy, HostBinding } from '@angular/core';
1+
import { Component, forwardRef, ChangeDetectionStrategy } from '@angular/core';
22
import { IgxGridComponent } from './grid.component';
33
import { IgxRowDirective } from '../row.directive';
44

@@ -10,11 +10,6 @@ import { IgxRowDirective } from '../row.directive';
1010
})
1111
export class IgxGridRowComponent extends IgxRowDirective<IgxGridComponent> {
1212

13-
@HostBinding('class.igx-grid__tr--mrl')
14-
public get hasColumnLayouts(): boolean {
15-
return this.grid.hasColumnLayouts;
16-
}
17-
1813
public getContext(col, row) {
1914
return {
2015
$implicit: col,

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,13 +94,13 @@
9494
</ng-container>
9595
<ng-template #record_template let-rowIndex="index" let-rowData let-disabledRow="disabled">
9696
<igx-grid-row [gridID]="id" [index]="rowIndex" [rowData]="rowData" [disabled]="disabledRow"
97-
[ngClass]="rowClasses | igxGridRowClasses:rowData:rowIndex:pipeTrigger"
97+
[ngClass]="rowClasses | igxGridRowClasses:row:row.inEditMode:row.selected:row.dirty:row.deleted:row.dragging:rowIndex:hasColumnLayouts:false:pipeTrigger"
9898
[ngStyle]="rowStyles | igxGridRowStyles:rowData:rowIndex:pipeTrigger" #row>
9999
</igx-grid-row>
100100
</ng-template>
101101
<ng-template #pinned_record_template let-rowIndex="index" let-rowData>
102102
<igx-grid-row [gridID]="id" [index]="rowIndex" [rowData]="rowData"
103-
[ngClass]="rowClasses | igxGridRowClasses:rowData:rowIndex:pipeTrigger"
103+
[ngClass]="rowClasses | igxGridRowClasses:row:row.inEditMode:row.selected:row.dirty:row.deleted:row.dragging:rowIndex:hasColumnLayouts:false:pipeTrigger"
104104
[ngStyle]="rowStyles | igxGridRowStyles:rowData:rowIndex:pipeTrigger"#row #pinnedRow>
105105
</igx-grid-row>
106106
</ng-template>

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,14 +68,14 @@
6868
</ng-template>
6969
<ng-template #hierarchical_record_template let-rowIndex="index" let-disabledRow="disabled" let-rowData>
7070
<igx-hierarchical-grid-row [gridID]="id" [index]="rowIndex" [disabled]="disabledRow" [rowData]="rowData"
71-
[ngClass]="rowClasses | igxGridRowClasses:rowData:rowIndex:pipeTrigger"
71+
[ngClass]="rowClasses | igxGridRowClasses:row:row.inEditMode:row.selected:row.dirty:row.deleted:row.dragging:rowIndex:hasColumnLayouts:false:pipeTrigger"
7272
[ngStyle]="rowStyles | igxGridRowStyles:rowData:rowIndex:pipeTrigger" #row>
7373
</igx-hierarchical-grid-row>
7474
</ng-template>
7575

7676
<ng-template #pinned_hierarchical_record_template let-rowIndex="index" let-rowData>
7777
<igx-hierarchical-grid-row [gridID]="id" [index]="rowIndex" [rowData]="rowData"
78-
[ngClass]="rowClasses | igxGridRowClasses:rowData:rowIndex:pipeTrigger"
78+
[ngClass]="rowClasses | igxGridRowClasses:row:row.inEditMode:row.selected:row.dirty:row.deleted:row.dragging:rowIndex:hasColumnLayouts:false:pipeTrigger"
7979
[ngStyle]="rowStyles | igxGridRowStyles:rowData:rowIndex:pipeTrigger" #row #pinnedRow>
8080
</igx-hierarchical-grid-row>
8181
</ng-template>

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

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -211,14 +211,6 @@ export class IgxRowDirective<T extends IgxGridBaseDirective & GridType> implemen
211211
return this.index;
212212
}
213213

214-
/**
215-
* @hidden
216-
*/
217-
@HostBinding('class')
218-
get styleClasses(): string {
219-
return this.resolveClasses();
220-
}
221-
222214
/**
223215
* @hidden
224216
*/
@@ -583,21 +575,6 @@ export class IgxRowDirective<T extends IgxGridBaseDirective & GridType> implemen
583575
this.addAnimationEnd.emit(this);
584576
}
585577

586-
/**
587-
* @hidden
588-
*/
589-
protected resolveClasses(): string {
590-
const indexClass = this.index % 2 ? this.grid.evenRowCSS : this.grid.oddRowCSS;
591-
const selectedClass = this.selected ? 'igx-grid__tr--selected' : '';
592-
const editClass = this.inEditMode ? 'igx-grid__tr--edit' : '';
593-
const dirtyClass = this.dirty ? 'igx-grid__tr--edited' : '';
594-
const deletedClass = this.deleted ? 'igx-grid__tr--deleted' : '';
595-
const mrlClass = this.grid.hasColumnLayouts ? 'igx-grid__tr--mrl' : '';
596-
const dragClass = this.dragging ? 'igx-grid__tr--drag' : '';
597-
return `${this.defaultCssClass} ${indexClass} ${selectedClass} ${editClass} ${dirtyClass}
598-
${deletedClass} ${mrlClass} ${dragClass}`.trim();
599-
}
600-
601578
/**
602579
* @hidden
603580
*/

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

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -159,13 +159,4 @@ export class IgxTreeGridRowComponent extends IgxRowDirective<IgxTreeGridComponen
159159
public beginAddChild() {
160160
this.grid.crudService.enterAddRowMode(this, true);
161161
}
162-
163-
/**
164-
* @hidden
165-
*/
166-
protected resolveClasses(): string {
167-
const classes = super.resolveClasses();
168-
const filteredClass = this.treeRow.isFilteredOutParent ? 'igx-grid__tr--filtered' : '';
169-
return `${classes} ${filteredClass}`;
170-
}
171162
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,13 +70,13 @@
7070
<ng-container *ngTemplateOutlet="hasPinnedRecords && !isRowPinningToTop ? pinnedRecordsTemplate : null"></ng-container>
7171
<ng-template #record_template let-rowIndex="index" let-disabledRow="disabled" let-rowData>
7272
<igx-tree-grid-row [gridID]="id" [index]="rowIndex" [treeRow]="rowData" [disabled]="disabledRow"
73-
[ngClass]="rowClasses | igxGridRowClasses:rowData:rowIndex:pipeTrigger"
73+
[ngClass]="rowClasses | igxGridRowClasses:row:row.inEditMode:row.selected:row.dirty:row.deleted:row.dragging:rowIndex:hasColumnLayouts:row.treeRow.isFilteredOutParent:pipeTrigger"
7474
[ngStyle]="rowStyles | igxGridRowStyles:rowData:rowIndex:pipeTrigger" #row>
7575
</igx-tree-grid-row>
7676
</ng-template>
7777
<ng-template #pinned_record_template let-rowIndex="index" let-rowData>
7878
<igx-tree-grid-row [gridID]="id" [index]="rowIndex" [treeRow]="rowData"
79-
[ngClass]="rowClasses | igxGridRowClasses:rowData:rowIndex:pipeTrigger"
79+
[ngClass]="rowClasses | igxGridRowClasses:row:row.inEditMode:row.selected:row.dirty:row.deleted:row.dragging:rowIndex:hasColumnLayouts:row.treeRow.isFilteredOutParent:pipeTrigger"
8080
[ngStyle]="rowStyles | igxGridRowStyles:rowData:rowIndex:pipeTrigger"#row #pinnedRow>
8181
</igx-tree-grid-row>
8282
</ng-template>

0 commit comments

Comments
 (0)