mirror of
https://github.com/bec-project/bec_atlas.git
synced 2025-07-13 22:51:49 +02:00
refactor: using resource and signals to trigger event changes
This commit is contained in:
@ -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>
|
@ -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);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user