From 030b1348e6fe83040874d6a95c60fcd34bcc14a0 Mon Sep 17 00:00:00 2001 From: appel_c Date: Tue, 28 Jan 2025 10:54:52 +0100 Subject: [PATCH] refactor: using resource and signals to trigger event changes --- .../app/scan-table/scan-table.component.html | 18 +-- .../app/scan-table/scan-table.component.ts | 136 ++++++++++-------- 2 files changed, 88 insertions(+), 66 deletions(-) diff --git a/frontend/bec_atlas/src/app/scan-table/scan-table.component.html b/frontend/bec_atlas/src/app/scan-table/scan-table.component.html index 3123080..9f627dd 100644 --- a/frontend/bec_atlas/src/app/scan-table/scan-table.component.html +++ b/frontend/bec_atlas/src/app/scan-table/scan-table.component.html @@ -31,23 +31,25 @@

{{ element[column] }}

} - + - + - - + + +
+ [pageIndex]="offset()/limit()" + aria-label="Select page" + sticky= true>
\ No newline at end of file diff --git a/frontend/bec_atlas/src/app/scan-table/scan-table.component.ts b/frontend/bec_atlas/src/app/scan-table/scan-table.component.ts index b87be9d..cb51739 100644 --- a/frontend/bec_atlas/src/app/scan-table/scan-table.component.ts +++ b/frontend/bec_atlas/src/app/scan-table/scan-table.component.ts @@ -4,6 +4,9 @@ import { WritableSignal, signal, ViewChild, + computed, + resource, + Signal, } from '@angular/core'; import { ScanCountService, ScanDataService } from '../core/remote-data.service'; import { ScanDataResponse } from '../core/model/scan-data'; @@ -21,6 +24,17 @@ import { import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { StarRatingModule } from 'angular-star-rating'; import { MatSort } from '@angular/material/sort'; +import { firstValueFrom, Observable } from 'rxjs'; +import { ScanCountResponse } from '../core/model/scan-count'; + +export interface ResourceStatus { + status: any; +} +export interface ResourceLoaderParams { + request: any; + abortSignal: AbortSignal; + previous: ResourceStatus; +} @Component({ selector: 'app-scan-table', @@ -42,15 +56,14 @@ import { MatSort } from '@angular/material/sort'; changeDetection: ChangeDetectionStrategy.OnPush, }) export class ScanTableComponent { - // private tableData: new MatTableDataSource(); // Initialize as empty array - // tableData: ScanDataResponse[] = []; - tableData: WritableSignal = signal([]); - limit: number = 10; - offset: number = 0; - totalScanCount: number = 0; - page: number = this.offset / this.limit; + tableData: Signal; + totalScanCount: Signal; + limit = signal(10); + offset = signal(0); + sessionId = signal(''); + + // page: number = this.offset / this.limit; pageEvent: PageEvent = new PageEvent(); - sessionId: string = ''; sorting: number = -1; displayedColumns: string[] = [ 'scan_number', @@ -71,67 +84,74 @@ export class ScanTableComponent { 'info', ]; + reloadCriteria = computed(() => ({ + sessionId: this.sessionId(), + offset: this.offset(), + limit: this.limit(), + })); + + loadScanDataResource = resource({ + request: () => this.reloadCriteria(), + loader: ({ request, abortSignal }): Promise => { + return firstValueFrom( + this.scanData.getScanData( + request.sessionId, + request.offset, + request.limit, + this.displayedColumns, + false, + { scan_number: this.sorting } + ) + ); + }, + }); + + loadScanCountResource = resource({ + request: () => this.reloadCriteria(), + loader: ({ request, abortSignal }): Promise => { + return firstValueFrom(this.scanCount.getScanCount(request.sessionId)); + }, + }); + + handleScanData(data: ScanDataResponse[] | []) { + for (const entry of data) { + if (entry.user_data && entry.user_data['user_rating']) { + entry.user_rating = entry.user_data['user_rating']; + } + } + return data; + } + + handleCountData(data: ScanCountResponse | 0) { + if (data === 0) { + return 0; + } + return data.count; + } + constructor( private scanData: ScanDataService, private scanCount: ScanCountService - ) {} + ) { + this.tableData = computed(() => + this.handleScanData(this.loadScanDataResource.value() || []) + ); + this.totalScanCount = computed(() => + this.handleCountData(this.loadScanCountResource.value() || 0) + ); + } @ViewChild(MatPaginator) paginator!: MatPaginator; @ViewChild(MatSort) sort!: MatSort; ngOnInit(): void { - this.sessionId = '6793628df62026a414d9338e'; - this.updateUI(); + this.sessionId.set('6793628df62026a414d9338e'); + // this.updateUI(); } handlePageEvent(event: PageEvent) { this.pageEvent = event; - this.offset = event.pageIndex * event.pageSize; - this.limit = event.pageSize; - this.page = this.offset / this.limit; - this.updateUI(); - } - - updateUI() { - this.updateTotalScanCount(this.sessionId); - this.updateTableData(this.sessionId); - } - - updateTableData(sessionId: string) { - this.scanData - .getScanData( - sessionId, - this.offset, - this.limit, - this.displayedColumns, - false, - { scan_number: this.sorting } - ) - .subscribe({ - next: (data) => { - console.log('Received data: ', data); - for (const entry of data) { - if (entry.user_data && entry.user_data['user_rating']) { - entry.user_rating = entry.user_data['user_rating']; - } - } - this.tableData.set(data); - }, - error: (error) => { - console.error('Error fetching data: ', error); - }, - }); - } - - updateTotalScanCount(sessionId: string) { - this.scanCount.getScanCount(sessionId).subscribe({ - next: (data) => { - console.log('Received data: ', data); - this.totalScanCount = data.count; - }, - error: (error) => { - console.error('Error fetching data: ', error); - }, - }); + this.offset.set(event.pageIndex * event.pageSize); + this.limit.set(event.pageSize); } }