Skip to content

Commit c5f9133

Browse files
committed
Merge remote-tracking branch 'origin/master' into vmihalkov/groupby
2 parents 7f2fd29 + e54b6f1 commit c5f9133

File tree

9 files changed

+179
-47
lines changed

9 files changed

+179
-47
lines changed

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

Lines changed: 36 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2479,15 +2479,7 @@ export class IgxGridBaseDirective extends DisplayDensityBase implements
24792479
*/
24802480
protected _columnPinning = false;
24812481

2482-
2483-
/**
2484-
* @hidden
2485-
*/
2486-
public get pinnedRecords() {
2487-
return this._pinnedRecords;
2488-
}
2489-
2490-
protected _pinnedRecords = [];
2482+
protected _pinnedRecordIDs = [];
24912483

24922484
/**
24932485
* @hidden
@@ -2652,6 +2644,32 @@ export class IgxGridBaseDirective extends DisplayDensityBase implements
26522644
});
26532645
}
26542646

2647+
/**
2648+
* @hidden
2649+
* @internal
2650+
*/
2651+
public isRecordPinned(rec) {
2652+
const id = this.primaryKey ? rec[this.primaryKey] : rec;
2653+
return this._pinnedRecordIDs.indexOf(id) !== -1;
2654+
}
2655+
2656+
/**
2657+
* @hidden
2658+
* @internal
2659+
*/
2660+
public pinRecordIndex(rec) {
2661+
const id = this.primaryKey ? rec[this.primaryKey] : rec;
2662+
return this._pinnedRecordIDs.indexOf(id);
2663+
}
2664+
2665+
/**
2666+
* @hidden
2667+
* @internal
2668+
*/
2669+
public get hasPinnedRecords() {
2670+
return this._pinnedRecordIDs.length > 0;
2671+
}
2672+
26552673
private keydownHandler = (event) => {
26562674
const key = event.key.toLowerCase();
26572675
if ((isNavigationKey(key) && event.keyCode !== 32) || key === 'tab' || key === 'pagedown' || key === 'pageup') {
@@ -4066,8 +4084,7 @@ export class IgxGridBaseDirective extends DisplayDensityBase implements
40664084
* @param index The index at which to insert the row in the pinned collection.
40674085
*/
40684086
public pinRow(rowID: any, index?: number): boolean {
4069-
const rec = this.gridAPI.get_rec_by_id(rowID);
4070-
if (!rec || this.pinnedRecords.indexOf(rec) !== -1 || this.data.indexOf(rec) === -1) {
4087+
if (this._pinnedRecordIDs.indexOf(rowID) !== -1) {
40714088
return false;
40724089
}
40734090
const row = this.gridAPI.get_row_by_key(rowID);
@@ -4080,7 +4097,9 @@ export class IgxGridBaseDirective extends DisplayDensityBase implements
40804097
};
40814098
this.onRowPinning.emit(eventArgs);
40824099

4083-
this.pinnedRecords.splice(eventArgs.insertAtIndex || this.pinnedRecords.length, 0, rec);
4100+
this.endEdit(true);
4101+
4102+
this._pinnedRecordIDs.splice(eventArgs.insertAtIndex || this._pinnedRecordIDs.length, 0, rowID);
40844103
this._pipeTrigger++;
40854104
if (this.gridAPI.grid) {
40864105
this.notifyChanges(true);
@@ -4098,9 +4117,8 @@ export class IgxGridBaseDirective extends DisplayDensityBase implements
40984117
* @param rowID The row id - primaryKey value or the data record instance.
40994118
*/
41004119
public unpinRow(rowID: any) {
4101-
const rec = this.gridAPI.get_rec_by_id(rowID);
4102-
const index = this.pinnedRecords.indexOf(rec);
4103-
if (index === -1 || !rec) {
4120+
const index = this._pinnedRecordIDs.indexOf(rowID);
4121+
if (index === -1) {
41044122
return false;
41054123
}
41064124
const row = this.gridAPI.get_row_by_key(rowID);
@@ -4110,7 +4128,8 @@ export class IgxGridBaseDirective extends DisplayDensityBase implements
41104128
row: row
41114129
};
41124130
this.onRowPinning.emit(eventArgs);
4113-
this.pinnedRecords.splice(index, 1);
4131+
this.endEdit(true);
4132+
this._pinnedRecordIDs.splice(index, 1);
41144133
this._pipeTrigger++;
41154134
if (this.gridAPI.grid) {
41164135
this.cdr.detectChanges();
@@ -4121,7 +4140,7 @@ export class IgxGridBaseDirective extends DisplayDensityBase implements
41214140

41224141
get pinnedRowHeight() {
41234142
const containerHeight = this.pinContainer ? this.pinContainer.nativeElement.offsetHeight : 0;
4124-
return this.pinnedRecords.length > 0 ? containerHeight : 0;
4143+
return this._pinnedRecordIDs.length > 0 ? containerHeight : 0;
41254144
}
41264145

41274146
get totalHeight() {

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,23 +109,25 @@
109109
[igxColumnMovingDrop]="headerContainer" [attr.droppable]="true" id="left"
110110
class="igx-grid__scroll-on-drag-pinned" [style.left.px]="pinnedWidth"></span>
111111
<ng-template #pinnedRecordsTemplate>
112-
<ng-container *ngFor="let rowData of pinnedRecords
112+
<ng-container *ngFor="let rowData of data
113+
| gridTransaction:id:pipeTrigger
113114
| visibleColumns:hasVisibleColumns
115+
| rowPinning:id:true:pipeTrigger
114116
| gridFiltering:filteringExpressionsTree:filterStrategy:advancedFilteringExpressionsTree:id:pipeTrigger:filteringPipeTrigger
115117
| gridSort:sortingExpressions:sortStrategy:id:pipeTrigger
116118
| gridDetails:hasDetails:expansionStates:pipeTrigger; let rowIndex = index">
117119
<ng-container *ngTemplateOutlet="getRowTemplate(rowData); context: getContext(rowData, rowIndex, true)">
118120
</ng-container>
119121
</ng-container>
120122
</ng-template>
121-
<div #pinContainer *ngIf='pinnedRecords.length > 0 && isRowPinningToTop' class='igx-grid__tr--pinned igx-grid__tr--pinned-top'>
123+
<div #pinContainer *ngIf='hasPinnedRecords && isRowPinningToTop' class='igx-grid__tr--pinned igx-grid__tr--pinned-top'>
122124
<ng-container *ngTemplateOutlet="pinnedRecordsTemplate">
123125
</ng-container>
124126
</div>
125127
<ng-template igxGridFor let-rowData [igxGridForOf]="data
126128
| gridTransaction:id:pipeTrigger
127129
| visibleColumns:hasVisibleColumns
128-
| rowPinning:id:pipeTrigger
130+
| rowPinning:id:false:pipeTrigger
129131
| gridFiltering:filteringExpressionsTree:filterStrategy:advancedFilteringExpressionsTree:id:pipeTrigger:filteringPipeTrigger
130132
| gridSort:sortingExpressions:sortStrategy:id:pipeTrigger
131133
| gridGroupBy:groupingExpressions:groupingExpansionState:groupsExpanded:id:groupsRecords:pipeTrigger
@@ -146,7 +148,7 @@
146148
(onBeforeViewDetach)='viewDetachHandler($event)'>
147149
</ng-template>
148150
</ng-template>
149-
<div #pinContainer *ngIf='pinnedRecords.length > 0 && !isRowPinningToTop' class='igx-grid__tr--pinned igx-grid__tr--pinned-bottom' [style.bottom.px]='pinnedBottom'>
151+
<div #pinContainer *ngIf='hasPinnedRecords && !isRowPinningToTop' class='igx-grid__tr--pinned igx-grid__tr--pinned-bottom' [style.bottom.px]='pinnedBottom'>
150152
<ng-container *ngTemplateOutlet="pinnedRecordsTemplate">
151153
</ng-container>
152154
</div>

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -830,7 +830,7 @@ export class IgxGridComponent extends IgxGridBaseDirective implements GridType,
830830
if (pinned && !this.isRowPinningToTop) {
831831
rowIndex = rowIndex + this.dataView.length;
832832
}
833-
rowIndex = !pinned && this.isRowPinningToTop ? rowIndex + this.pinnedRecords.length : rowIndex;
833+
rowIndex = !pinned && this.isRowPinningToTop ? rowIndex + this._pinnedRecordIDs.length : rowIndex;
834834
if (this.isDetailRecord(rowData)) {
835835
const cachedData = this.childDetailTemplates.get(rowData.detailsData);
836836
const rowID = this.primaryKey ? rowData.detailsData[this.primaryKey] : this.data.indexOf(rowData.detailsData);

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

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -164,16 +164,20 @@ export class IgxGridRowPinningPipe implements PipeTransform {
164164

165165
constructor(private gridAPI: GridBaseAPIService<IgxGridBaseDirective & GridType>) {}
166166

167-
public transform(collection: any[] , id: string, pipeTrigger: number) {
167+
public transform(collection: any[] , id: string, isPinned = false, pipeTrigger: number) {
168168
const grid = this.gridAPI.grid;
169-
const pinnedRows = grid.pinnedRecords;
170-
if (pinnedRows.length === 0) {
171-
return collection;
169+
170+
if (!grid.hasPinnedRecords) {
171+
return isPinned ? [] : collection;
172172
}
173173

174174
const result = collection.filter((value, index) => {
175-
return pinnedRows.indexOf(value) === -1;
175+
return isPinned ? grid.isRecordPinned(value) : !grid.isRecordPinned(value);
176176
});
177+
if (isPinned) {
178+
// pinned records should be ordered as they were pinned.
179+
result.sort((rec1, rec2) => grid.pinRecordIndex(rec1) - grid.pinRecordIndex(rec2));
180+
}
177181
return result;
178182
}
179183
}

0 commit comments

Comments
 (0)