refactor: using resource and signals to trigger event changes

This commit is contained in:
2025-01-28 10:54:52 +01:00
parent 5593d27be7
commit 030b1348e6
2 changed files with 88 additions and 66 deletions

View File

@ -31,23 +31,25 @@
<p> {{ element[column] }}</p> <p> {{ element[column] }}</p>
} }
</ng-container> </ng-container>
<!-- Header Row --> <!-- Header Row -->
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr> <tr mat-header-row *matHeaderRowDef="displayedColumns; sticky: true"></tr>
<!-- Data Rows --> <!-- Data Rows -->
<tr mat-row *matRowDef="let row; columns: displayedColumns"></tr> <tr mat-row *matRowDef="let row; columns: displayedColumns"></tr>
</table> </table>
</mat-card> </mat-card>
</div>
<div class="table-paginator">
<mat-paginator <mat-paginator
#paginator #paginator
class="table-paginator" class="table-paginator"
(page) = "handlePageEvent($event)" (page) = "handlePageEvent($event)"
[length]="totalScanCount" [length]="totalScanCount()"
[pageSize]= "limit" [pageSize]= "limit()"
[showFirstLastButtons]="true" [showFirstLastButtons]="true"
[pageSizeOptions]="[5, 10, 25, 100]" [pageSizeOptions]="[5, 10, 25, 100]"
[pageIndex]="page" [pageIndex]="offset()/limit()"
aria-label="Select page"> aria-label="Select page"
sticky= true>
</mat-paginator> </mat-paginator>
</div> </div>

View File

@ -4,6 +4,9 @@ import {
WritableSignal, WritableSignal,
signal, signal,
ViewChild, ViewChild,
computed,
resource,
Signal,
} from '@angular/core'; } from '@angular/core';
import { ScanCountService, ScanDataService } from '../core/remote-data.service'; import { ScanCountService, ScanDataService } from '../core/remote-data.service';
import { ScanDataResponse } from '../core/model/scan-data'; import { ScanDataResponse } from '../core/model/scan-data';
@ -21,6 +24,17 @@ import {
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
import { StarRatingModule } from 'angular-star-rating'; import { StarRatingModule } from 'angular-star-rating';
import { MatSort } from '@angular/material/sort'; 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({ @Component({
selector: 'app-scan-table', selector: 'app-scan-table',
@ -42,15 +56,14 @@ import { MatSort } from '@angular/material/sort';
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
}) })
export class ScanTableComponent { export class ScanTableComponent {
// private tableData: new MatTableDataSource<ScanDataResponse[]>(); // Initialize as empty array tableData: Signal<ScanDataResponse[]>;
// tableData: ScanDataResponse[] = []; totalScanCount: Signal<number>;
tableData: WritableSignal<ScanDataResponse[]> = signal([]); limit = signal<number>(10);
limit: number = 10; offset = signal<number>(0);
offset: number = 0; sessionId = signal<string>('');
totalScanCount: number = 0;
page: number = this.offset / this.limit; // page: number = this.offset / this.limit;
pageEvent: PageEvent = new PageEvent(); pageEvent: PageEvent = new PageEvent();
sessionId: string = '';
sorting: number = -1; sorting: number = -1;
displayedColumns: string[] = [ displayedColumns: string[] = [
'scan_number', 'scan_number',
@ -71,67 +84,74 @@ export class ScanTableComponent {
'info', 'info',
]; ];
reloadCriteria = computed(() => ({
sessionId: this.sessionId(),
offset: this.offset(),
limit: this.limit(),
}));
loadScanDataResource = resource({
request: () => this.reloadCriteria(),
loader: ({ request, abortSignal }): Promise<ScanDataResponse[]> => {
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<ScanCountResponse> => {
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( constructor(
private scanData: ScanDataService, private scanData: ScanDataService,
private scanCount: ScanCountService 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(MatPaginator) paginator!: MatPaginator;
@ViewChild(MatSort) sort!: MatSort; @ViewChild(MatSort) sort!: MatSort;
ngOnInit(): void { ngOnInit(): void {
this.sessionId = '6793628df62026a414d9338e'; this.sessionId.set('6793628df62026a414d9338e');
this.updateUI(); // this.updateUI();
} }
handlePageEvent(event: PageEvent) { handlePageEvent(event: PageEvent) {
this.pageEvent = event; this.pageEvent = event;
this.offset = event.pageIndex * event.pageSize; this.offset.set(event.pageIndex * event.pageSize);
this.limit = event.pageSize; this.limit.set(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);
},
});
} }
} }