Browse Source

Merge remote-tracking branch 'origin/main' into feature/enable-strict-null-checks-in-ui

pull/6264/head
KenTandrian 3 weeks ago
parent
commit
a61eb220fb
  1. 16
      libs/ui/src/lib/accounts-table/accounts-table.component.html
  2. 108
      libs/ui/src/lib/accounts-table/accounts-table.component.ts

16
libs/ui/src/lib/accounts-table/accounts-table.component.html

@ -1,9 +1,9 @@
@if (showActions) { @if (showActions()) {
<div class="d-flex justify-content-end"> <div class="d-flex justify-content-end">
<button <button
class="align-items-center d-flex" class="align-items-center d-flex"
mat-stroked-button mat-stroked-button
[disabled]="dataSource?.data.length < 2" [disabled]="dataSource()?.data.length < 2"
(click)="onTransferBalance()" (click)="onTransferBalance()"
> >
<ion-icon class="mr-2" name="arrow-redo-outline" /> <ion-icon class="mr-2" name="arrow-redo-outline" />
@ -19,7 +19,7 @@
matSort matSort
matSortActive="name" matSortActive="name"
matSortDirection="asc" matSortDirection="asc"
[dataSource]="dataSource" [dataSource]="dataSource()"
> >
<ng-container matColumnDef="status"> <ng-container matColumnDef="status">
<th <th
@ -336,9 +336,9 @@
<td *matFooterCellDef class="px-1" mat-footer-cell></td> <td *matFooterCellDef class="px-1" mat-footer-cell></td>
</ng-container> </ng-container>
<tr *matHeaderRowDef="displayedColumns" mat-header-row></tr> <tr *matHeaderRowDef="displayedColumns()" mat-header-row></tr>
<tr <tr
*matRowDef="let row; columns: displayedColumns" *matRowDef="let row; columns: displayedColumns()"
mat-row mat-row
[ngClass]="{ [ngClass]="{
'cursor-pointer': hasPermissionToOpenDetails 'cursor-pointer': hasPermissionToOpenDetails
@ -346,14 +346,14 @@
(click)="onOpenAccountDetailDialog(row.id)" (click)="onOpenAccountDetailDialog(row.id)"
></tr> ></tr>
<tr <tr
*matFooterRowDef="displayedColumns" *matFooterRowDef="displayedColumns()"
mat-footer-row mat-footer-row
[ngClass]="{ 'd-none': isLoading || !showFooter }" [ngClass]="{ 'd-none': isLoading() || !showFooter }"
></tr> ></tr>
</table> </table>
</div> </div>
@if (isLoading) { @if (isLoading()) {
<ngx-skeleton-loader <ngx-skeleton-loader
animation="pulse" animation="pulse"
class="px-4 py-3" class="px-4 py-3"

108
libs/ui/src/lib/accounts-table/accounts-table.component.ts

@ -10,10 +10,12 @@ import {
Component, Component,
EventEmitter, EventEmitter,
Input, Input,
OnChanges,
OnDestroy, OnDestroy,
Output, Output,
ViewChild computed,
inject,
input,
viewChild
} from '@angular/core'; } from '@angular/core';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
import { MatMenuModule } from '@angular/material/menu'; import { MatMenuModule } from '@angular/material/menu';
@ -33,7 +35,7 @@ import {
walletOutline walletOutline
} from 'ionicons/icons'; } from 'ionicons/icons';
import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader';
import { Subject, Subscription } from 'rxjs'; import { Subject } from 'rxjs';
@Component({ @Component({
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
@ -53,20 +55,13 @@ import { Subject, Subscription } from 'rxjs';
styleUrls: ['./accounts-table.component.scss'], styleUrls: ['./accounts-table.component.scss'],
templateUrl: './accounts-table.component.html' templateUrl: './accounts-table.component.html'
}) })
export class GfAccountsTableComponent implements OnChanges, OnDestroy { export class GfAccountsTableComponent implements OnDestroy {
@Input() accounts: Account[];
@Input() activitiesCount: number; @Input() activitiesCount: number;
@Input() baseCurrency: string; @Input() baseCurrency: string;
@Input() deviceType: string; @Input() deviceType: string;
@Input() hasPermissionToOpenDetails = true; @Input() hasPermissionToOpenDetails = true;
@Input() locale = getLocale(); @Input() locale = getLocale();
@Input() showActions: boolean;
@Input() showActivitiesCount = true;
@Input() showAllocationInPercentage: boolean;
@Input() showBalance = true;
@Input() showFooter = true; @Input() showFooter = true;
@Input() showValue = true;
@Input() showValueInBaseCurrency = true;
@Input() totalBalanceInBaseCurrency: number; @Input() totalBalanceInBaseCurrency: number;
@Input() totalValueInBaseCurrency: number; @Input() totalValueInBaseCurrency: number;
@ -74,71 +69,72 @@ export class GfAccountsTableComponent implements OnChanges, OnDestroy {
@Output() accountToUpdate = new EventEmitter<Account>(); @Output() accountToUpdate = new EventEmitter<Account>();
@Output() transferBalance = new EventEmitter<void>(); @Output() transferBalance = new EventEmitter<void>();
@ViewChild(MatSort) sort: MatSort; public readonly accounts = input.required<Account[] | undefined>();
public readonly showActions = input<boolean>();
public dataSource = new MatTableDataSource<Account>(); public readonly showActivitiesCount = input(true);
public displayedColumns: string[] = []; public readonly showAllocationInPercentage = input<boolean>();
public isLoading = true; public readonly showBalance = input(true);
public routeQueryParams: Subscription; public readonly showValue = input(true);
public readonly showValueInBaseCurrency = input(false);
private unsubscribeSubject = new Subject<void>(); public readonly sort = viewChild.required(MatSort);
public constructor( protected readonly dataSource = computed(() => {
private notificationService: NotificationService, const dataSource = new MatTableDataSource<Account>(this.accounts());
private router: Router dataSource.sortingDataAccessor = getLowercase;
) { dataSource.sort = this.sort();
addIcons({ return dataSource;
arrowRedoOutline,
createOutline,
documentTextOutline,
ellipsisHorizontal,
eyeOffOutline,
trashOutline,
walletOutline
}); });
}
public ngOnChanges() { protected readonly displayedColumns = computed(() => {
this.displayedColumns = ['status', 'account', 'platform']; const columns = ['status', 'account', 'platform'];
if (this.showActivitiesCount) { if (this.showActivitiesCount()) {
this.displayedColumns.push('activitiesCount'); columns.push('activitiesCount');
} }
if (this.showBalance) { if (this.showBalance()) {
this.displayedColumns.push('balance'); columns.push('balance');
} }
if (this.showValue) { if (this.showValue()) {
this.displayedColumns.push('value'); columns.push('value');
} }
this.displayedColumns.push('currency'); columns.push('currency');
if (this.showValueInBaseCurrency) { if (this.showValueInBaseCurrency()) {
this.displayedColumns.push('valueInBaseCurrency'); columns.push('valueInBaseCurrency');
} }
if (this.showAllocationInPercentage) { if (this.showAllocationInPercentage()) {
this.displayedColumns.push('allocation'); columns.push('allocation');
} }
this.displayedColumns.push('comment'); columns.push('comment');
if (this.showActions) { if (this.showActions()) {
this.displayedColumns.push('actions'); columns.push('actions');
} }
this.isLoading = true; return columns;
});
this.dataSource = new MatTableDataSource(this.accounts); protected readonly isLoading = computed(() => !this.accounts());
this.dataSource.sortingDataAccessor = getLowercase;
this.dataSource.sort = this.sort; private readonly notificationService = inject(NotificationService);
private readonly router = inject(Router);
private readonly unsubscribeSubject = new Subject<void>();
if (this.accounts) { public constructor() {
this.isLoading = false; addIcons({
} arrowRedoOutline,
createOutline,
documentTextOutline,
ellipsisHorizontal,
eyeOffOutline,
trashOutline,
walletOutline
});
} }
public onDeleteAccount(aId: string) { public onDeleteAccount(aId: string) {

Loading…
Cancel
Save