Skip to content

Commit 3cc045c

Browse files
authored
fix(row-pinning): preserve pinned state when editing the primary key (#12656)
1 parent f565d92 commit 3cc045c

File tree

3 files changed

+58
-17
lines changed

3 files changed

+58
-17
lines changed

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

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { IFilteringExpressionsTree } from '../data-operations/filtering-expressi
66
import { Transaction, TransactionType, State } from '../services/transaction/transaction';
77
import { IgxCell, IgxGridCRUDService, IgxEditRow } from './common/crud.service';
88
import { CellType, ColumnType, GridServiceType, GridType, RowType } from './common/grid.interface';
9-
import { IGridEditEventArgs, IRowToggleEventArgs } from './common/events';
9+
import { IGridEditEventArgs, IPinRowEventArgs, IRowToggleEventArgs } from './common/events';
1010
import { IgxColumnMovingService } from './moving/moving.service';
1111
import { IGroupingExpression } from '../data-operations/grouping-expression.interface';
1212
import { ISortingExpression, SortingDirection } from '../data-operations/sorting-strategy';
@@ -151,6 +151,14 @@ export class GridBaseAPIService<T extends GridType> implements GridServiceType {
151151
this.grid.validation.update(cell.id.rowID, newRowData);
152152
}
153153
if (this.grid.primaryKey === cell.column.field) {
154+
if (this.grid.pinnedRecords.length > 0) {
155+
if (this.grid.pinnedRecords.find(r => r == cell.rowData)) {
156+
const pinnedRowIndex = this.grid.pinnedRecords.indexOf(cell.rowData);
157+
const previousRowId = cell.value;
158+
this.unpin_row(previousRowId);
159+
this.pin_row(args.newValue, pinnedRowIndex);
160+
}
161+
}
154162
if (this.grid.selectionService.isRowSelected(cell.id.rowID)) {
155163
this.grid.selectionService.deselectRow(cell.id.rowID);
156164
this.grid.selectionService.selectRowById(args.newValue);
@@ -543,6 +551,49 @@ export class GridBaseAPIService<T extends GridType> implements GridServiceType {
543551
return DataUtil.sort(cloneArray(data), expressions, this.grid.sortStrategy, this.grid);
544552
}
545553

554+
public pin_row(rowID: any, index?: number, row?: RowType): void {
555+
const grid = (this.grid as any);
556+
if (grid._pinnedRecordIDs.indexOf(rowID) !== -1) {
557+
return;
558+
}
559+
const eventArgs = this.get_pin_row_event_args(rowID, index, row, true);
560+
grid.rowPinning.emit(eventArgs);
561+
562+
if (eventArgs.cancel) {
563+
return;
564+
}
565+
const insertIndex = typeof eventArgs.insertAtIndex === 'number' ? eventArgs.insertAtIndex : grid._pinnedRecordIDs.length;
566+
grid._pinnedRecordIDs.splice(insertIndex, 0, rowID);
567+
}
568+
569+
public unpin_row(rowID: any): void {
570+
const grid = (this.grid as any);
571+
const index = grid._pinnedRecordIDs.indexOf(rowID);
572+
if (index === -1) {
573+
return;
574+
}
575+
const eventArgs = this.get_pin_row_event_args(rowID, null , null, false);
576+
grid.rowPinning.emit(eventArgs);
577+
578+
if (eventArgs.cancel) {
579+
return;
580+
}
581+
grid._pinnedRecordIDs.splice(index, 1);
582+
}
583+
584+
public get_pin_row_event_args(rowID: any, index?: number, row?: RowType, pinned?: boolean) {
585+
const eventArgs: IPinRowEventArgs = {
586+
isPinned: pinned ? true : false,
587+
rowID,
588+
row,
589+
cancel: false
590+
}
591+
if (typeof index === 'number') {
592+
eventArgs.insertAtIndex = index;
593+
}
594+
return eventArgs;
595+
}
596+
546597
/**
547598
* Updates related row of provided grid's data source with provided new row value
548599
*

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {
66
IGridEditDoneEventArgs, IRowDataEventArgs, IGridKeydownEventArgs, IRowDragStartEventArgs,
77
IColumnMovingEventArgs, IPinColumnEventArgs,
88
IActiveNodeChangeEventArgs,
9-
ICellPosition, IFilteringEventArgs, IColumnResizeEventArgs, IRowToggleEventArgs, IGridToolbarExportEventArgs
9+
ICellPosition, IFilteringEventArgs, IColumnResizeEventArgs, IRowToggleEventArgs, IGridToolbarExportEventArgs, IPinRowEventArgs
1010
} from '../common/events';
1111
import { DisplayDensity, IDensityChangedEventArgs } from '../../core/displayDensity';
1212
import { ChangeDetectorRef, ElementRef, EventEmitter, InjectionToken, QueryList, TemplateRef, ViewContainerRef } from '@angular/core';
@@ -285,6 +285,8 @@ export interface GridServiceType {
285285
sort_multiple(expressions: ISortingExpression[]): void;
286286
clear_sort(fieldName: string): void;
287287

288+
get_pin_row_event_args(rowID: any, index?: number, row?: RowType , pinned?: boolean): IPinRowEventArgs;
289+
288290
filterDataByExpressions(expressionsTree: IFilteringExpressionsTree): any[];
289291
sortDataByExpressions(data: any[], expressions: ISortingExpression[]): any[];
290292

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

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5121,20 +5121,12 @@ export abstract class IgxGridBaseDirective extends DisplayDensityBase implements
51215121
if (this._pinnedRecordIDs.indexOf(rowID) !== -1) {
51225122
return false;
51235123
}
5124-
5125-
const eventArgs: IPinRowEventArgs = {
5126-
insertAtIndex: index,
5127-
isPinned: true,
5128-
rowID,
5129-
row,
5130-
cancel: false
5131-
};
5124+
const eventArgs = this.gridAPI.get_pin_row_event_args(rowID, index, row, true);
51325125
this.rowPinning.emit(eventArgs);
51335126

51345127
if (eventArgs.cancel) {
51355128
return;
51365129
}
5137-
51385130
this.crudService.endEdit(false);
51395131

51405132
const insertIndex = typeof eventArgs.insertAtIndex === 'number' ? eventArgs.insertAtIndex : this._pinnedRecordIDs.length;
@@ -5164,12 +5156,8 @@ export abstract class IgxGridBaseDirective extends DisplayDensityBase implements
51645156
if (index === -1) {
51655157
return false;
51665158
}
5167-
const eventArgs: IPinRowEventArgs = {
5168-
isPinned: false,
5169-
rowID,
5170-
row,
5171-
cancel: false
5172-
};
5159+
5160+
const eventArgs = this.gridAPI.get_pin_row_event_args(rowID, null, row, false);
51735161
this.rowPinning.emit(eventArgs);
51745162

51755163
if (eventArgs.cancel) {

0 commit comments

Comments
 (0)