Skip to content

Commit eecbadc

Browse files
spike-rabbitfh1ch
authored andcommitted
fix: always call <ngx-datatable-row-detail [rowHeight]="function"> with correct index
Previously, when using `<ngx-datatable-row-detail [rowHeight]="function">`, the function was called sporadically with a wrong index. This is due to a bug in the body-component, where the rendered offset-index was passed to the cache. But the cache is operating on all rows, not the rendered ones. So instead, we need to pass only the offset, if external paging is enabled.
1 parent 9bd9adb commit eecbadc

File tree

2 files changed

+108
-1
lines changed

2 files changed

+108
-1
lines changed

projects/ngx-datatable/src/lib/components/body/body.component.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -655,7 +655,7 @@ export class DataTableBodyComponent<TRow extends Row = any> implements OnInit, O
655655
rowHeight: this.rowHeight(),
656656
detailRowHeight: this.getDetailRowHeight,
657657
externalVirtual: this.scrollbarV() && this.externalPaging(),
658-
indexOffset: this.indexes().first,
658+
indexOffset: this.externalPaging() ? this.offset() * this.pageSize() : 0,
659659
rowCount: this.rowCount(),
660660
rowExpansions: new Set<TRow>(this.rowDetail() ? this.rowExpansions() : [])
661661
});
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
import { Component, signal, viewChild } from '@angular/core';
2+
import { ComponentFixture, TestBed } from '@angular/core/testing';
3+
import { DataTableColumnDirective } from '@siemens/ngx-datatable';
4+
5+
import { DatatableComponent } from '../datatable.component';
6+
import { DatatableRowDetailTemplateDirective } from './row-detail-template.directive';
7+
import { DatatableRowDetailDirective } from './row-detail.directive';
8+
9+
describe('DatatableRowDetailDirective', () => {
10+
let fixture: ComponentFixture<TestFixtureComponent>;
11+
let component: TestFixtureComponent;
12+
let table: DatatableComponent;
13+
14+
interface TestRow {
15+
id: number;
16+
name: string;
17+
}
18+
19+
@Component({
20+
imports: [
21+
DatatableComponent,
22+
DatatableRowDetailDirective,
23+
DatatableRowDetailTemplateDirective,
24+
DataTableColumnDirective
25+
],
26+
template: `
27+
<ngx-datatable
28+
#myTable
29+
[rows]="rows()"
30+
[scrollbarV]="true"
31+
[rowHeight]="50"
32+
[headerHeight]="50"
33+
[footerHeight]="50"
34+
[externalPaging]="externalPaging()"
35+
[offset]="offset()"
36+
>
37+
<ngx-datatable-row-detail [rowHeight]="detailRowHeight" (toggle)="onDetailToggle($event)">
38+
<ng-template let-row="row" ngx-datatable-row-detail-template>
39+
<div>Detail for {{ row.name }}</div>
40+
</ng-template>
41+
</ngx-datatable-row-detail>
42+
43+
<ngx-datatable-column name="id" />
44+
<ngx-datatable-column name="name" />
45+
</ngx-datatable>
46+
`
47+
})
48+
class TestFixtureComponent {
49+
readonly table = viewChild.required<DatatableComponent<TestRow>>('myTable');
50+
51+
readonly rows = signal<TestRow[]>([
52+
{ id: 1, name: 'Row 1' },
53+
{ id: 2, name: 'Row 2' },
54+
{ id: 3, name: 'Row 3' },
55+
{ id: 4, name: 'Row 4' },
56+
{ id: 5, name: 'Row 5' }
57+
]);
58+
59+
readonly externalPaging = signal<boolean>(false);
60+
readonly offset = signal<number>(0);
61+
62+
detailRowHeight = jasmine.createSpy('detailRowHeight').and.returnValue(100);
63+
64+
onDetailToggle(_event: any) {
65+
// Handle toggle event
66+
}
67+
}
68+
69+
beforeEach(async () => {
70+
await TestBed.configureTestingModule({
71+
imports: [TestFixtureComponent]
72+
}).compileComponents();
73+
74+
fixture = TestBed.createComponent(TestFixtureComponent);
75+
component = fixture.componentInstance;
76+
fixture.detectChanges();
77+
table = component.table();
78+
});
79+
80+
it('should stop calling rowHeight for collapsed details', () => {
81+
// Expand first and second rows
82+
table.rowDetail!.toggleExpandRow(component.rows()[0]);
83+
table.rowDetail!.toggleExpandRow(component.rows()[1]);
84+
fixture.detectChanges();
85+
86+
// Collapse the first row
87+
table.rowDetail!.toggleExpandRow(component.rows()[0]);
88+
component.detailRowHeight.calls.reset();
89+
fixture.detectChanges();
90+
91+
expect(component.detailRowHeight).toHaveBeenCalledWith(component.rows()[1], 1);
92+
});
93+
94+
it('should call rowHeight with correct indices after expandAllRows', () => {
95+
component.detailRowHeight.calls.reset();
96+
97+
// Expand all rows
98+
table.rowDetail!.expandAllRows();
99+
fixture.detectChanges();
100+
101+
expect(component.detailRowHeight).toHaveBeenCalledWith(component.rows()[0], 0);
102+
expect(component.detailRowHeight).toHaveBeenCalledWith(component.rows()[1], 1);
103+
expect(component.detailRowHeight).toHaveBeenCalledWith(component.rows()[2], 2);
104+
expect(component.detailRowHeight).toHaveBeenCalledWith(component.rows()[3], 3);
105+
expect(component.detailRowHeight).toHaveBeenCalledWith(component.rows()[4], 4);
106+
});
107+
});

0 commit comments

Comments
 (0)