Skip to content

Commit 4fc8414

Browse files
committed
refactor: migrate constructor assigned inputs to signals
For breaking change not refer to 4bfbf62
1 parent 4bfbf62 commit 4fc8414

File tree

5 files changed

+48
-55
lines changed

5 files changed

+48
-55
lines changed

projects/ngx-datatable/src/lib/components/datatable.component.html

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<div visibilityObserver (visible)="recalculate()">
22
<div role="table">
3-
@if (headerHeight) {
3+
@if (headerHeight()) {
44
<datatable-header
55
role="rowgroup"
66
[sorts]="sorts"
@@ -10,17 +10,17 @@
1010
[offsetX]="_offsetX"
1111
[dealsWithGroup]="groupedRows !== undefined"
1212
[columns]="_internalColumns"
13-
[headerHeight]="headerHeight"
13+
[headerHeight]="headerHeight()"
1414
[reorderable]="reorderable()"
1515
[targetMarkerTemplate]="targetMarkerTemplate()"
16-
[sortAscendingIcon]="cssClasses.sortAscending"
17-
[sortDescendingIcon]="cssClasses.sortDescending"
18-
[sortUnsetIcon]="cssClasses.sortUnset"
16+
[sortAscendingIcon]="cssClasses().sortAscending"
17+
[sortDescendingIcon]="cssClasses().sortDescending"
18+
[sortUnsetIcon]="cssClasses().sortUnset"
1919
[allRowsSelected]="allRowsSelected"
2020
[selectionType]="selectionType()"
2121
[verticalScrollVisible]="verticalScrollVisible"
2222
[enableClearingSortState]="enableClearingSortState()"
23-
[ariaHeaderCheckboxMessage]="messages.ariaHeaderCheckboxMessage ?? 'Select all rows'"
23+
[ariaHeaderCheckboxMessage]="messages().ariaHeaderCheckboxMessage ?? 'Select all rows'"
2424
(sort)="onColumnSort($event)"
2525
(resize)="onColumnResize($event)"
2626
(resizing)="onColumnResizing($event)"
@@ -42,7 +42,7 @@
4242
[loadingIndicator]="loadingIndicator()"
4343
[ghostLoadingIndicator]="ghostLoadingIndicator"
4444
[externalPaging]="externalPaging()"
45-
[rowHeight]="rowHeight"
45+
[rowHeight]="rowHeight()"
4646
[rowCount]="rowCount"
4747
[offset]="offset"
4848
[trackByProp]="trackByProp()"
@@ -63,15 +63,15 @@
6363
[summaryHeight]="summaryHeight()"
6464
[summaryPosition]="summaryPosition()"
6565
[verticalScrollVisible]="verticalScrollVisible"
66-
[ariaRowCheckboxMessage]="messages.ariaRowCheckboxMessage ?? 'Select row'"
66+
[ariaRowCheckboxMessage]="messages().ariaRowCheckboxMessage ?? 'Select row'"
6767
[ariaGroupHeaderCheckboxMessage]="
68-
messages.ariaGroupHeaderCheckboxMessage ?? 'Select row group'
68+
messages().ariaGroupHeaderCheckboxMessage ?? 'Select row group'
6969
"
7070
[disableRowCheck]="disableRowCheck()"
7171
[rowDraggable]="rowDraggable()"
7272
[rowDragEvents]="rowDragEvents"
7373
[rowDefTemplate]="rowDefTemplate"
74-
[cssClasses]="cssClasses"
74+
[cssClasses]="cssClasses()"
7575
(page)="onBodyPage($event)"
7676
(activate)="activate.emit($event)"
7777
(rowContextmenu)="onRowContextmenu($event)"
@@ -87,27 +87,27 @@
8787
<div
8888
role="cell"
8989
class="empty-row"
90-
[innerHTML]="messages.emptyMessage ?? 'No data to display'"
90+
[innerHTML]="messages().emptyMessage ?? 'No data to display'"
9191
></div>
9292
</div>
9393
</ng-content>
9494
</datatable-body>
9595
</div>
96-
@if (footerHeight) {
96+
@if (footerHeight()) {
9797
<datatable-footer
9898
[rowCount]="groupedRows !== undefined ? _internalRows.length : rowCount"
9999
[groupCount]="groupedRows !== undefined ? rowCount : undefined"
100100
[pageSize]="pageSize"
101101
[offset]="offset"
102-
[footerHeight]="footerHeight"
102+
[footerHeight]="footerHeight()"
103103
[footerTemplate]="footer"
104-
[totalMessage]="messages.totalMessage ?? 'total'"
105-
[pagerLeftArrowIcon]="cssClasses.pagerLeftArrow"
106-
[pagerRightArrowIcon]="cssClasses.pagerRightArrow"
107-
[pagerPreviousIcon]="cssClasses.pagerPrevious"
104+
[totalMessage]="messages().totalMessage ?? 'total'"
105+
[pagerLeftArrowIcon]="cssClasses().pagerLeftArrow"
106+
[pagerRightArrowIcon]="cssClasses().pagerRightArrow"
107+
[pagerPreviousIcon]="cssClasses().pagerPrevious"
108108
[selectedCount]="selected.length"
109-
[selectedMessage]="!!selectionType() && (messages.selectedMessage ?? 'selected')"
110-
[pagerNextIcon]="cssClasses.pagerNext"
109+
[selectedMessage]="!!selectionType() && (messages().selectedMessage ?? 'selected')"
110+
[pagerNextIcon]="cssClasses().pagerNext"
111111
(page)="onFooterPage($event)"
112112
/>
113113
}

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

Lines changed: 19 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,9 @@ export class DatatableComponent<TRow extends Row = any>
219219
* The row height; which is necessary
220220
* to calculate the height for the lazy rendering.
221221
*/
222-
@Input() rowHeight: number | 'auto' | ((row: TRow) => number) = 30;
222+
readonly rowHeight = input<number | 'auto' | ((row: TRow) => number)>(
223+
this.configuration?.rowHeight ?? 30
224+
);
223225

224226
/**
225227
* Type of column width distribution formula.
@@ -231,13 +233,15 @@ export class DatatableComponent<TRow extends Row = any>
231233
* The minimum header height in pixels.
232234
* Pass a falsey for no header
233235
*/
234-
@Input() headerHeight: number | 'auto' = 30;
236+
readonly headerHeight = input<number | 'auto'>(this.configuration?.headerHeight ?? 30);
235237

236238
/**
237239
* The minimum footer height in pixels.
238240
* Pass falsey for no footer
239241
*/
240-
@Input({ transform: numberAttribute }) footerHeight = 0;
242+
readonly footerHeight = input(this.configuration?.footerHeight ?? 0, {
243+
transform: numberAttribute
244+
});
241245

242246
/**
243247
* If the table should use external paging
@@ -359,7 +363,9 @@ export class DatatableComponent<TRow extends Row = any>
359363
/**
360364
* Css class overrides
361365
*/
362-
@Input() cssClasses: Partial<Required<NgxDatatableConfig>['cssClasses']> = {};
366+
readonly cssClasses = input<Partial<Required<NgxDatatableConfig>['cssClasses']>>(
367+
this.configuration?.cssClasses ? { ...this.configuration.cssClasses } : {}
368+
);
363369

364370
/**
365371
* Message overrides for localization
@@ -381,7 +387,9 @@ export class DatatableComponent<TRow extends Row = any>
381387
* }
382388
* ```
383389
*/
384-
@Input() messages: Partial<Required<NgxDatatableConfig>['messages']> = {};
390+
readonly messages = input<Partial<Required<NgxDatatableConfig>['messages']>>(
391+
this.configuration?.messages ? { ...this.configuration.messages } : {}
392+
);
385393

386394
/**
387395
* A function which is called with the row and should return either:
@@ -541,7 +549,7 @@ export class DatatableComponent<TRow extends Row = any>
541549
*/
542550
@HostBinding('class.fixed-header')
543551
get isFixedHeader(): boolean {
544-
const headerHeight: number | string = this.headerHeight;
552+
const headerHeight: number | string = this.headerHeight();
545553
return typeof headerHeight === 'string' ? (headerHeight as string) !== 'auto' : true;
546554
}
547555

@@ -551,7 +559,7 @@ export class DatatableComponent<TRow extends Row = any>
551559
*/
552560
@HostBinding('class.fixed-row')
553561
get isFixedRow(): boolean {
554-
return this.rowHeight !== 'auto';
562+
return this.rowHeight() !== 'auto';
555563
}
556564

557565
/**
@@ -712,7 +720,7 @@ export class DatatableComponent<TRow extends Row = any>
712720
_columns!: TableColumn[];
713721
_subscriptions: Subscription[] = [];
714722
_ghostLoadingIndicator = false;
715-
_defaultColumnWidth?: number;
723+
_defaultColumnWidth = this.configuration?.defaultColumnWidth ?? 150;
716724
/**
717725
* To have this available for all components.
718726
* The Footer itself is not available in the injection context in templates,
@@ -726,22 +734,6 @@ export class DatatableComponent<TRow extends Row = any>
726734
// this will be set to true once rows are available and rendered on UI
727735
private readonly _rowInitDone = signal(false);
728736

729-
constructor() {
730-
// apply global settings from Module.forRoot
731-
if (this.configuration) {
732-
if (this.configuration.messages) {
733-
this.messages = { ...this.configuration.messages };
734-
}
735-
if (this.configuration.cssClasses) {
736-
this.cssClasses = { ...this.configuration.cssClasses };
737-
}
738-
this.headerHeight = this.configuration.headerHeight ?? this.headerHeight;
739-
this.footerHeight = this.configuration.footerHeight ?? this.footerHeight;
740-
this.rowHeight = this.configuration.rowHeight ?? this.rowHeight;
741-
this._defaultColumnWidth = this.configuration.defaultColumnWidth ?? 150;
742-
}
743-
}
744-
745737
/**
746738
* Lifecycle hook that is called after data-bound
747739
* properties of a directive are initialized.
@@ -984,8 +976,8 @@ export class DatatableComponent<TRow extends Row = any>
984976
if (this.headerElement) {
985977
height = height - this.headerElement.nativeElement.getBoundingClientRect().height;
986978
}
987-
if (this.footerHeight) {
988-
height = height - this.footerHeight;
979+
if (this.footerHeight()) {
980+
height = height - this.footerHeight();
989981
}
990982
this.bodyHeight = height;
991983
}
@@ -1064,7 +1056,7 @@ export class DatatableComponent<TRow extends Row = any>
10641056
// This is because an expanded row is still considered to be a child of
10651057
// the original row. Hence calculation would use rowHeight only.
10661058
if (this.scrollbarV() && this.virtualization()) {
1067-
const size = Math.ceil(this.bodyHeight / (this.rowHeight as number));
1059+
const size = Math.ceil(this.bodyHeight / (this.rowHeight() as number));
10681060
return Math.max(size, 0);
10691061
}
10701062

projects/ngx-datatable/src/lib/components/footer/footer.component.spec.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Component, DebugElement, TemplateRef, viewChild, ViewChild } from '@angular/core';
1+
import { Component, DebugElement, signal, TemplateRef, viewChild, ViewChild } from '@angular/core';
22
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
33
import { By } from '@angular/platform-browser';
44

@@ -183,6 +183,7 @@ class TestFixtureComponent {
183183
footerTemplate?: { template: TemplateRef<any> };
184184
selectedCount = 0;
185185
selectedMessage?: string;
186+
readonly messages = signal({});
186187

187188
/**
188189
* establishes a reference to a test template that can

projects/ngx-datatable/src/lib/components/footer/pager.component.spec.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ import {
88
} from '@angular/core';
99
import { ComponentFixture, TestBed } from '@angular/core/testing';
1010
import { By } from '@angular/platform-browser';
11+
import { DatatableComponent } from '@siemens/ngx-datatable';
1112

1213
import { DATATABLE_COMPONENT_TOKEN } from '../../utils/table-token';
13-
import type { DatatableComponent } from '../datatable.component';
1414
import { DatatablePagerComponent } from './pager.component';
1515
import { PagerHarness } from './testing/pager.harness';
1616

@@ -28,9 +28,9 @@ interface MockFooter {
2828

2929
describe('DataTablePagerComponent', () => {
3030
let fixture: ComponentFixture<DatatablePagerComponent>;
31-
let pager: DatatablePagerComponent;
3231
let harness: PagerHarness;
3332
let footer: MockFooter;
33+
let messages: WritableSignal<ReturnType<DatatableComponent['messages']>>;
3434

3535
beforeEach(async () => {
3636
footer = {
@@ -44,19 +44,19 @@ describe('DataTablePagerComponent', () => {
4444
pagerPreviousIcon: signal(''),
4545
page: { emit: ({ page }: { page: number }) => footer.curPage.set(page) }
4646
};
47+
messages = signal({});
4748
TestBed.overrideComponent(DatatablePagerComponent, {
4849
set: {
4950
changeDetection: ChangeDetectionStrategy.Default,
5051
providers: [
5152
{
5253
provide: DATATABLE_COMPONENT_TOKEN,
53-
useValue: { _footerComponent: signal(footer) }
54+
useValue: { _footerComponent: signal(footer), messages }
5455
}
5556
]
5657
}
5758
});
5859
fixture = TestBed.createComponent(DatatablePagerComponent);
59-
pager = fixture.componentInstance;
6060
harness = await TestbedHarnessEnvironment.harnessForFixture(fixture, PagerHarness);
6161
});
6262

@@ -273,8 +273,8 @@ describe('DataTablePagerComponent', () => {
273273
};
274274

275275
describe('takes messages-overrides from table', () => {
276-
const setMessages = (messages: DatatableComponent['messages']) => {
277-
(pager as any).datatable = { messages };
276+
const setMessages = (overrides: ReturnType<DatatableComponent['messages']>) => {
277+
messages.set(overrides);
278278
// do a change detection on the real changeDetectionRef
279279
fixture.componentRef.injector.get(ChangeDetectorRef).detectChanges();
280280
};

projects/ngx-datatable/src/lib/components/footer/pager.component.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,8 @@ export class DatatablePagerComponent {
106106
// Ideally we can one day fetch those attributes from a global state, but for now this is fine.
107107
private datatable = inject(DATATABLE_COMPONENT_TOKEN);
108108

109-
protected get messages(): DatatableComponent['messages'] {
110-
return this.datatable?.messages ?? {};
109+
protected get messages(): ReturnType<DatatableComponent['messages']> {
110+
return this.datatable?.messages() ?? {};
111111
}
112112

113113
protected readonly page = computed(() => this.datatable._footerComponent()!.curPage());

0 commit comments

Comments
 (0)