Skip to content

Commit 31df26d

Browse files
Fix new row to be added on correct position and to enter edit mode - 15.0 (#12412)
* fix(tree-grid): add new row on correct position * refactor(tree-grid): add missing new line
1 parent 7902a3b commit 31df26d

File tree

4 files changed

+102
-6
lines changed

4 files changed

+102
-6
lines changed

projects/igniteui-angular/src/lib/grids/common/crud.service.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -634,7 +634,9 @@ export class IgxGridCRUDService extends IgxRowAddCrudState {
634634

635635
this.grid.navigateTo(this.row.index, -1);
636636
// when selecting the dummy row we need to adjust for top pinned rows
637-
const indexAdjust = this.grid.isRowPinningToTop && !this.addRowParent.isPinned ? this.grid.pinnedRows.length : 0;
637+
const indexAdjust = this.grid.isRowPinningToTop ?
638+
(!this.addRowParent.isPinned ? this.grid.pinnedRows.length : 0) :
639+
(!this.addRowParent.isPinned ? 0 : this.grid.unpinnedRecords.length);
638640

639641
// TODO: Type this without shoving a bunch of internal properties in the row type
640642
const dummyRow = this.grid.gridAPI.get_row_by_index(this.row.index + indexAdjust) as any;

projects/igniteui-angular/src/lib/grids/tree-grid/tree-grid-add-row-ui.spec.ts

Lines changed: 68 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import { TestBed, fakeAsync, waitForAsync } from '@angular/core/testing';
33
import { By } from '@angular/platform-browser';
44
import { IgxTreeGridModule, IgxTreeGridComponent } from './public_api';
5-
import { IgxTreeGridEditActionsComponent } from '../../test-utils/tree-grid-components.spec';
5+
import { IgxTreeGridEditActionsComponent, IgxTreeGridEditActionsPinningComponent } from '../../test-utils/tree-grid-components.spec';
66
import { configureTestSuite } from '../../test-utils/configure-suite';
77
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
88
import { IgxActionStripModule, IgxActionStripComponent } from '../../action-strip/public_api';
@@ -24,7 +24,8 @@ describe('IgxTreeGrid - Add Row UI #tGrid', () => {
2424
beforeAll(waitForAsync(() => {
2525
TestBed.configureTestingModule({
2626
declarations: [
27-
IgxTreeGridEditActionsComponent
27+
IgxTreeGridEditActionsComponent,
28+
IgxTreeGridEditActionsPinningComponent
2829
],
2930
imports: [IgxTreeGridModule, NoopAnimationsModule, IgxActionStripModule]
3031
})
@@ -128,5 +129,70 @@ describe('IgxTreeGrid - Add Row UI #tGrid', () => {
128129

129130
expect(treeGrid.rowList.length).toBe(1);
130131
});
132+
133+
it('should add row on correct position and enter edit mode from pinned row - pinning position: Top', () => {
134+
fix = TestBed.createComponent(IgxTreeGridEditActionsPinningComponent);
135+
fix.detectChanges();
136+
treeGrid = fix.componentInstance.treeGrid;
137+
actionStrip = fix.componentInstance.actionStrip;
138+
139+
treeGrid.pinRow(1);
140+
treeGrid.pinRow(6);
141+
142+
expect(treeGrid.getRowByKey(1).pinned).toBeTrue();
143+
expect(treeGrid.getRowByKey(6).pinned).toBeTrue();
144+
145+
actionStrip.show(treeGrid.rowList.toArray()[1]);
146+
fix.detectChanges();
147+
148+
const editActions = fix.debugElement.queryAll(By.css(`igx-grid-action-button`));
149+
150+
expect(editActions[3].componentInstance.iconName).toBe('add-row');
151+
const addRowBtn = editActions[3].componentInstance;
152+
addRowBtn.actionClick.emit();
153+
fix.detectChanges();
154+
endTransition();
155+
156+
let addRow = treeGrid.gridAPI.get_row_by_index(2);
157+
expect(addRow.addRowUI).toBeTrue();
158+
expect(addRow.inEditMode).toBeTrue();
159+
160+
treeGrid.gridAPI.crudService.endEdit(true);
161+
fix.detectChanges();
162+
});
163+
164+
it('should add row on correct position and enter edit mode from pinned row - pinning position: Bottom', () => {
165+
fix = TestBed.createComponent(IgxTreeGridEditActionsPinningComponent);
166+
fix.detectChanges();
167+
treeGrid = fix.componentInstance.treeGrid;
168+
actionStrip = fix.componentInstance.actionStrip;
169+
170+
treeGrid.pinning = fix.componentInstance.pinningConfig;
171+
fix.detectChanges();
172+
173+
treeGrid.pinRow(1);
174+
treeGrid.pinRow(6);
175+
176+
expect(treeGrid.getRowByKey(1).pinned).toBeTrue();
177+
expect(treeGrid.getRowByKey(6).pinned).toBeTrue();
178+
179+
actionStrip.show(treeGrid.rowList.last);
180+
fix.detectChanges();
181+
182+
const editActions = fix.debugElement.queryAll(By.css(`igx-grid-action-button`));
183+
184+
expect(editActions[3].componentInstance.iconName).toBe('add-row');
185+
const addRowBtn = editActions[3].componentInstance;
186+
addRowBtn.actionClick.emit();
187+
fix.detectChanges();
188+
endTransition();
189+
190+
let addRow = treeGrid.gridAPI.get_row_by_index(10);
191+
expect(addRow.addRowUI).toBeTrue();
192+
expect(addRow.inEditMode).toBeTrue();
193+
194+
treeGrid.gridAPI.crudService.endEdit(true);
195+
fix.detectChanges();
196+
});
131197
});
132198
});

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,12 @@ export class IgxTreeGridAddRowPipe implements PipeTransform {
315315
}
316316
const copy = collection.slice(0);
317317
const rec = (this.grid.crudService.row as IgxAddRow).recordRef;
318-
copy.splice(this.grid.crudService.row.index, 0, rec);
318+
if (this.grid.crudService.addRowParent.isPinned) {
319+
const parentRowIndex = copy.findIndex(record => record.rowID === this.grid.crudService.addRowParent.rowID);
320+
copy.splice(parentRowIndex + 1, 0, rec);
321+
} else {
322+
copy.splice(this.grid.crudService.row.index, 0, rec);
323+
}
319324
this.grid.records.set(rec.key, rec);
320325
return copy;
321326
}

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

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import { Component, ViewChild, OnInit } from '@angular/core';
22
import { IgxTreeGridComponent } from '../grids/tree-grid/tree-grid.component';
33
import { SampleTestData } from './sample-test-data.spec';
4-
import { IgxSummaryOperand, IgxNumberSummaryOperand, IgxSummaryResult } from '../grids/public_api';
4+
import { IgxSummaryOperand, IgxNumberSummaryOperand, IgxSummaryResult, IPinningConfig } from '../grids/public_api';
55
import { DisplayDensity } from '../core/displayDensity';
66
import { IgxActionStripComponent } from '../action-strip/action-strip.component';
7-
import { DefaultSortingStrategy } from 'igniteui-angular';
7+
import { DefaultSortingStrategy, RowPinningPosition } from 'igniteui-angular';
88
import { IGroupingExpression } from '../data-operations/grouping-expression.interface';
99
import { IgxTreeGridGroupByAreaComponent } from '../grids/grouping/tree-grid-group-by-area.component';
1010

@@ -1025,3 +1025,26 @@ export class IgxTreeGridPrimaryForeignKeyCascadeSelectionComponent {
10251025
public actionStrip: IgxActionStripComponent;
10261026
public data = SampleTestData.employeeSmallPrimaryForeignKeyTreeData();
10271027
}
1028+
1029+
@Component({
1030+
template: `
1031+
<igx-tree-grid #treeGrid [data]="data" primaryKey="ID" foreignKey="ParentID" width="900px" height="600px" [rowEditable]="true">
1032+
<igx-column [field]="'ID'" dataType="number"></igx-column>
1033+
<igx-column [field]="'ParentID'" dataType="number"></igx-column>
1034+
<igx-column [field]="'Name'" dataType="string"></igx-column>
1035+
<igx-column [field]="'JobTitle'" dataType="string"></igx-column>
1036+
<igx-column [field]="'Age'" dataType="number"></igx-column>
1037+
<igx-action-strip #actionStrip>
1038+
<igx-grid-pinning-actions></igx-grid-pinning-actions>
1039+
<igx-grid-editing-actions [addRow]="true"></igx-grid-editing-actions>
1040+
</igx-action-strip>
1041+
</igx-tree-grid>
1042+
`
1043+
})
1044+
export class IgxTreeGridEditActionsPinningComponent {
1045+
@ViewChild(IgxTreeGridComponent, { static: true }) public treeGrid: IgxTreeGridComponent;
1046+
@ViewChild('actionStrip', { read: IgxActionStripComponent, static: true })
1047+
public actionStrip: IgxActionStripComponent;
1048+
public data = SampleTestData.employeePrimaryForeignKeyTreeData();
1049+
public pinningConfig: IPinningConfig = { rows: RowPinningPosition.Bottom };
1050+
}

0 commit comments

Comments
 (0)