From 6c6f20c3fdbc1dc636bfc50532cf01dbac05ff7e Mon Sep 17 00:00:00 2001
From: Kenrick Tandrian <60643640+KenTandrian@users.noreply.github.com>
Date: Fri, 20 Feb 2026 23:28:06 +0700
Subject: [PATCH] Task/improve type safety in account balances component
(#6352)
* fix(lib): add type annotations for date adapter
* fix(lib): handle form value possibly null
* fix(lint): use arrow fn for validators
* fix(lib): accounts table typings
* fix(lib): remove unsubscribeSubject due to lack of observable
* fix(lib): remove validators variable
* feat(lib): implement inject functions
* feat(lib): make locale an input signal
* feat(lib): make showActions an input signal
* feat(lib): make accountId an input signal
* feat(lib): make accountCurrency an input signal
* feat(lib): make accountBalances an input signal
* feat(lib): make sort a viewChild signal
* feat(lib): implement isNil
---
.../account-balances.component.html | 10 +--
.../account-balances.component.ts | 68 +++++++++----------
.../accounts-table.component.ts | 2 +-
3 files changed, 37 insertions(+), 43 deletions(-)
diff --git a/libs/ui/src/lib/account-balances/account-balances.component.html b/libs/ui/src/lib/account-balances/account-balances.component.html
index caef922ed..29037a985 100644
--- a/libs/ui/src/lib/account-balances/account-balances.component.html
+++ b/libs/ui/src/lib/account-balances/account-balances.component.html
@@ -12,7 +12,7 @@
Date
-
+
@@ -37,7 +37,7 @@
@@ -58,7 +58,7 @@
- @if (showActions) {
+ @if (showActions()) {
diff --git a/libs/ui/src/lib/account-balances/account-balances.component.ts b/libs/ui/src/lib/account-balances/account-balances.component.ts
index 608ee1c75..7b26263b0 100644
--- a/libs/ui/src/lib/account-balances/account-balances.component.ts
+++ b/libs/ui/src/lib/account-balances/account-balances.component.ts
@@ -10,12 +10,12 @@ import {
ChangeDetectionStrategy,
Component,
EventEmitter,
- Input,
OnChanges,
- OnDestroy,
OnInit,
Output,
- ViewChild
+ inject,
+ input,
+ viewChild
} from '@angular/core';
import {
FormGroup,
@@ -39,8 +39,7 @@ import {
ellipsisHorizontal,
trashOutline
} from 'ionicons/icons';
-import { get } from 'lodash';
-import { Subject } from 'rxjs';
+import { get, isNil } from 'lodash';
import { GfValueComponent } from '../value';
@@ -63,50 +62,44 @@ import { GfValueComponent } from '../value';
styleUrls: ['./account-balances.component.scss'],
templateUrl: './account-balances.component.html'
})
-export class GfAccountBalancesComponent
- implements OnChanges, OnDestroy, OnInit
-{
- @Input() accountBalances: AccountBalancesResponse['balances'];
- @Input() accountCurrency: string;
- @Input() accountId: string;
- @Input() locale = getLocale();
- @Input() showActions = true;
-
+export class GfAccountBalancesComponent implements OnChanges, OnInit {
@Output() accountBalanceCreated = new EventEmitter();
@Output() accountBalanceDeleted = new EventEmitter();
- @ViewChild(MatSort) sort: MatSort;
+ public readonly accountBalances =
+ input.required();
+ public readonly accountCurrency = input.required();
+ public readonly accountId = input.required();
+ public readonly displayedColumns: string[] = ['date', 'value', 'actions'];
+ public readonly locale = input(getLocale());
+ public readonly showActions = input(true);
+ public readonly sort = viewChild(MatSort);
public accountBalanceForm = new FormGroup({
- balance: new FormControl(0, Validators.required),
- date: new FormControl(new Date(), Validators.required)
+ balance: new FormControl(0, (control) => Validators.required(control)),
+ date: new FormControl(new Date(), (control) => Validators.required(control))
});
public dataSource = new MatTableDataSource<
AccountBalancesResponse['balances'][0]
>();
- public displayedColumns: string[] = ['date', 'value', 'actions'];
- public Validators = Validators;
-
- private unsubscribeSubject = new Subject();
+ private dateAdapter = inject>(DateAdapter);
+ private notificationService = inject(NotificationService);
- public constructor(
- private dateAdapter: DateAdapter,
- private notificationService: NotificationService
- ) {
+ public constructor() {
addIcons({ calendarClearOutline, ellipsisHorizontal, trashOutline });
}
public ngOnInit() {
- this.dateAdapter.setLocale(this.locale);
+ this.dateAdapter.setLocale(this.locale());
}
public ngOnChanges() {
- if (this.accountBalances) {
- this.dataSource = new MatTableDataSource(this.accountBalances);
+ if (this.accountBalances()) {
+ this.dataSource = new MatTableDataSource(this.accountBalances());
- this.dataSource.sort = this.sort;
+ this.dataSource.sort = this.sort();
this.dataSource.sortingDataAccessor = get;
}
}
@@ -122,10 +115,16 @@ export class GfAccountBalancesComponent
}
public async onSubmitAccountBalance() {
+ const { balance, date } = this.accountBalanceForm.value;
+
+ if (isNil(balance) || !date) {
+ return;
+ }
+
const accountBalance: CreateAccountBalanceDto = {
- accountId: this.accountId,
- balance: this.accountBalanceForm.get('balance').value,
- date: format(this.accountBalanceForm.get('date').value, DATE_FORMAT)
+ balance,
+ accountId: this.accountId(),
+ date: format(date, DATE_FORMAT)
};
try {
@@ -141,9 +140,4 @@ export class GfAccountBalancesComponent
this.accountBalanceCreated.emit(accountBalance);
}
-
- public ngOnDestroy() {
- this.unsubscribeSubject.next();
- this.unsubscribeSubject.complete();
- }
}
diff --git a/libs/ui/src/lib/accounts-table/accounts-table.component.ts b/libs/ui/src/lib/accounts-table/accounts-table.component.ts
index d486b775f..99e68c679 100644
--- a/libs/ui/src/lib/accounts-table/accounts-table.component.ts
+++ b/libs/ui/src/lib/accounts-table/accounts-table.component.ts
@@ -53,7 +53,7 @@ import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
templateUrl: './accounts-table.component.html'
})
export class GfAccountsTableComponent {
- public readonly accounts = input.required();
+ public readonly accounts = input.required();
public readonly activitiesCount = input();
public readonly baseCurrency = input();
public readonly hasPermissionToOpenDetails = input(true);