Skip to content

Commit 5439b66

Browse files
authored
Merge branch 'master' into dmdimitrov/issue6845-master
2 parents 494f259 + 2cddb59 commit 5439b66

File tree

5 files changed

+511
-60
lines changed

5 files changed

+511
-60
lines changed

projects/igniteui-angular/src/lib/grids/api.service.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,9 @@ export class GridBaseAPIService <T extends IgxGridBaseDirective & GridType> {
8686
}
8787

8888
public get_row_by_key(rowSelector: any): IgxRowDirective<IgxGridBaseDirective & GridType> {
89+
if (!this.grid) {
90+
return null;
91+
}
8992
const primaryKey = this.grid.primaryKey;
9093
if (primaryKey !== undefined && primaryKey !== null) {
9194
return this.grid.dataRowList.find((row) => row.rowData[primaryKey] === rowSelector);

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

Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ import { IgxColumnComponent } from './columns/column.component';
147147
import { IgxColumnGroupComponent } from './columns/column-group.component';
148148
import { IGridSortingStrategy } from '../data-operations/sorting-strategy';
149149
import { IgxRowDragGhostDirective, IgxDragIndicatorIconDirective } from './row-drag.directive';
150+
import { isNumber } from 'util';
150151

151152
const MINIMUM_COLUMN_WIDTH = 136;
152153
const FILTER_ROW_HEIGHT = 50;
@@ -1747,8 +1748,8 @@ export class IgxGridBaseDirective extends DisplayDensityBase implements
17471748
/**
17481749
* @hidden @internal
17491750
*/
1750-
@ViewChild('pinContainer', { static: false })
1751-
public pinContainer: ElementRef;
1751+
@ViewChildren('pinContainer', { read: ElementRef })
1752+
public pinContainers: QueryList<ElementRef>;
17521753

17531754
/**
17541755
* @hidden @internal
@@ -2410,6 +2411,9 @@ export class IgxGridBaseDirective extends DisplayDensityBase implements
24102411
*/
24112412
protected destroy$ = new Subject<any>();
24122413

2414+
protected _filteredPinnedData;
2415+
protected _filteredUnpinnedData;
2416+
24132417
/**
24142418
* @hidden
24152419
*/
@@ -2670,6 +2674,14 @@ export class IgxGridBaseDirective extends DisplayDensityBase implements
26702674
return this._pinnedRecordIDs.length > 0;
26712675
}
26722676

2677+
/**
2678+
* @hidden
2679+
* @internal
2680+
*/
2681+
public get pinnedRecordsCount() {
2682+
return this._pinnedRecordIDs.length;
2683+
}
2684+
26732685
private keydownHandler = (event) => {
26742686
const key = event.key.toLowerCase();
26752687
if ((isNavigationKey(key) && event.keyCode !== 32) || key === 'tab' || key === 'pagedown' || key === 'pageup') {
@@ -2816,6 +2828,10 @@ export class IgxGridBaseDirective extends DisplayDensityBase implements
28162828
this.endEdit(true);
28172829
this.cdr.markForCheck();
28182830
});
2831+
2832+
this.onRowPinning.subscribe(() => {
2833+
this.summaryService.clearSummaryCache();
2834+
});
28192835
}
28202836

28212837
/**
@@ -2865,6 +2881,17 @@ export class IgxGridBaseDirective extends DisplayDensityBase implements
28652881
}
28662882
}
28672883

2884+
public setFilterData(data, pinned: boolean) {
2885+
if (this.hasPinnedRecords && pinned) {
2886+
this._filteredPinnedData = data;
2887+
this.filteredData = [... this._filteredPinnedData, ... this._filteredUnpinnedData];
2888+
} else if (this.hasPinnedRecords && !pinned) {
2889+
this._filteredUnpinnedData = data;
2890+
} else {
2891+
this.filteredData = data;
2892+
}
2893+
}
2894+
28682895
/**
28692896
* @hidden
28702897
* @internal
@@ -2956,6 +2983,12 @@ export class IgxGridBaseDirective extends DisplayDensityBase implements
29562983
vertScrDC.addEventListener('scroll', this.scrollHandler);
29572984
vertScrDC.addEventListener('wheel', () => this.wheelHandler());
29582985

2986+
this.pinContainers.changes.subscribe((c) => {
2987+
if (this.hasPinnedRecords) {
2988+
// on row pin containers change grid sizes should be recalculated.
2989+
this.calculateGridSizes();
2990+
}
2991+
});
29592992
}
29602993

29612994
/**
@@ -3080,6 +3113,7 @@ export class IgxGridBaseDirective extends DisplayDensityBase implements
30803113
public set expansionStates(value) {
30813114
this._expansionStates = new Map<any, boolean>(value);
30823115
this.expansionStatesChange.emit(this._expansionStates);
3116+
this.notifyChanges(true);
30833117
if (this.gridAPI.grid) {
30843118
this.cdr.detectChanges();
30853119
}
@@ -4099,7 +4133,8 @@ export class IgxGridBaseDirective extends DisplayDensityBase implements
40994133

41004134
this.endEdit(true);
41014135

4102-
this._pinnedRecordIDs.splice(eventArgs.insertAtIndex || this._pinnedRecordIDs.length, 0, rowID);
4136+
const insertIndex = isNumber(eventArgs.insertAtIndex) ? eventArgs.insertAtIndex : this._pinnedRecordIDs.length;
4137+
this._pinnedRecordIDs.splice(insertIndex, 0, rowID);
41034138
this._pipeTrigger++;
41044139
if (this.gridAPI.grid) {
41054140
this.notifyChanges(true);
@@ -4139,8 +4174,9 @@ export class IgxGridBaseDirective extends DisplayDensityBase implements
41394174
}
41404175

41414176
get pinnedRowHeight() {
4142-
const containerHeight = this.pinContainer ? this.pinContainer.nativeElement.offsetHeight : 0;
4143-
return this._pinnedRecordIDs.length > 0 ? containerHeight : 0;
4177+
const pinContainer = this.pinContainers && this.pinContainers.length > 0 ? this.pinContainers.first : null;
4178+
const containerHeight = pinContainer ? pinContainer.nativeElement.offsetHeight : 0;
4179+
return this.hasPinnedRecords ? containerHeight : 0;
41444180
}
41454181

41464182
get totalHeight() {

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

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -108,22 +108,29 @@
108108
<span *ngIf="hasMovableColumns && draggedColumn && pinnedColumns.length > 0"
109109
[igxColumnMovingDrop]="headerContainer" [attr.droppable]="true" id="left"
110110
class="igx-grid__scroll-on-drag-pinned" [style.left.px]="pinnedWidth"></span>
111-
<ng-template #pinnedRecordsTemplate>
112-
<ng-container *ngFor="let rowData of data
113-
| gridTransaction:id:pipeTrigger
114-
| visibleColumns:hasVisibleColumns
115-
| rowPinning:id:true:pipeTrigger
116-
| gridFiltering:filteringExpressionsTree:filterStrategy:advancedFilteringExpressionsTree:id:pipeTrigger:filteringPipeTrigger
117-
| gridSort:sortingExpressions:sortStrategy:id:pipeTrigger
118-
| gridDetails:hasDetails:expansionStates:pipeTrigger; let rowIndex = index">
119-
<ng-container *ngTemplateOutlet="getRowTemplate(rowData); context: getContext(rowData, rowIndex, true)">
111+
<ng-container *ngTemplateOutlet="hasPinnedRecords && isRowPinningToTop ? pinnedRecordsTemplate : null">
112+
</ng-container>
113+
<ng-template #pinnedRecordsTemplate>
114+
<ng-container *ngIf='data
115+
| gridTransaction:id:pipeTrigger
116+
| visibleColumns:hasVisibleColumns
117+
| rowPinning:id:true:pipeTrigger
118+
| gridFiltering:filteringExpressionsTree:filterStrategy:advancedFilteringExpressionsTree:id:pipeTrigger:filteringPipeTrigger:true
119+
| gridSort:sortingExpressions:sortStrategy:id:pipeTrigger
120+
| gridDetails:hasDetails:expansionStates:pipeTrigger as pinnedData'>
121+
<div #pinContainer *ngIf='pinnedData.length > 0'
122+
[ngClass]="{
123+
'igx-grid__tr--pinned-bottom': !isRowPinningToTop,
124+
'igx-grid__tr--pinned-top': isRowPinningToTop
125+
}"
126+
class='igx-grid__tr--pinned' [style.bottom.px]=' !isRowPinningToTop ? pinnedBottom : null'>
127+
<ng-container *ngFor="let rowData of pinnedData; let rowIndex = index">
128+
<ng-container *ngTemplateOutlet="getRowTemplate(rowData); context: getContext(rowData, rowIndex, true)">
129+
</ng-container>
120130
</ng-container>
121-
</ng-container>
122-
</ng-template>
123-
<div #pinContainer *ngIf='hasPinnedRecords && isRowPinningToTop' class='igx-grid__tr--pinned igx-grid__tr--pinned-top'>
124-
<ng-container *ngTemplateOutlet="pinnedRecordsTemplate">
125-
</ng-container>
126-
</div>
131+
</div>
132+
</ng-container>
133+
</ng-template>
127134
<ng-template igxGridFor let-rowData [igxGridForOf]="data
128135
| gridTransaction:id:pipeTrigger
129136
| visibleColumns:hasVisibleColumns
@@ -148,10 +155,8 @@
148155
(onBeforeViewDetach)='viewDetachHandler($event)'>
149156
</ng-template>
150157
</ng-template>
151-
<div #pinContainer *ngIf='hasPinnedRecords && !isRowPinningToTop' class='igx-grid__tr--pinned igx-grid__tr--pinned-bottom' [style.bottom.px]='pinnedBottom'>
152-
<ng-container *ngTemplateOutlet="pinnedRecordsTemplate">
153-
</ng-container>
154-
</div>
158+
<ng-container *ngTemplateOutlet="hasPinnedRecords && !isRowPinningToTop ? pinnedRecordsTemplate : null">
159+
</ng-container>
155160
<ng-template #record_template let-rowIndex="index" let-rowData>
156161
<igx-grid-row [gridID]="id" [index]="rowIndex" [rowData]="rowData" #row>
157162
</igx-grid-row>

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -103,10 +103,10 @@ export class IgxGridPagingPipe implements PipeTransform {
103103
if (!this.gridAPI.grid.paging) {
104104
return collection;
105105
}
106-
106+
const _perPage = perPage - this.gridAPI.grid.pinnedRecordsCount;
107107
const state = {
108108
index: page,
109-
recordsPerPage: perPage
109+
recordsPerPage: _perPage
110110
};
111111
DataUtil.correctPagingState(state, collection.data.length);
112112

@@ -135,7 +135,7 @@ export class IgxGridFilteringPipe implements PipeTransform {
135135

136136
public transform(collection: any[], expressionsTree: IFilteringExpressionsTree,
137137
filterStrategy: IFilteringStrategy,
138-
advancedExpressionsTree: IFilteringExpressionsTree, id: string, pipeTrigger: number, filteringPipeTrigger: number) {
138+
advancedExpressionsTree: IFilteringExpressionsTree, id: string, pipeTrigger: number, filteringPipeTrigger: number, pinned?) {
139139
const grid = this.gridAPI.grid;
140140
const state = {
141141
expressionsTree: expressionsTree,
@@ -148,7 +148,7 @@ export class IgxGridFilteringPipe implements PipeTransform {
148148
}
149149

150150
const result = DataUtil.filter(cloneArray(collection), state);
151-
grid.filteredData = result;
151+
grid.setFilterData(result, pinned);
152152
return result;
153153
}
154154
}

0 commit comments

Comments
 (0)