192 lines
5.3 KiB
TypeScript
192 lines
5.3 KiB
TypeScript
import { Component, OnInit } from '@angular/core';
|
|
import { HttpClient } from '@angular/common/http';
|
|
import { Observable } from 'rxjs';
|
|
import { FormControl } from '@angular/forms';
|
|
import { map, startWith } from 'rxjs/operators';
|
|
import { DatePipe } from '@angular/common';
|
|
|
|
@Component({
|
|
selector: 'app-task-logs',
|
|
templateUrl: './task-logs.component.html',
|
|
styleUrls: ['./task-logs.component.css']
|
|
})
|
|
export class TaskLogsComponent implements OnInit {
|
|
baseUrl: string = import.meta.env.NG_APP_BASE_API_URL;
|
|
traces: any[] = [];
|
|
groupedTraces: any[] = [];
|
|
commands: any[] = [];
|
|
clients: any[] = [];
|
|
length: number = 0;
|
|
itemsPerPage: number = 20;
|
|
page: number = 0;
|
|
loading: boolean = true;
|
|
pageSizeOptions: number[] = [10, 20, 30, 50];
|
|
datePipe: DatePipe = new DatePipe('es-ES');
|
|
|
|
columns = [
|
|
{
|
|
columnDef: 'id',
|
|
header: 'ID',
|
|
cell: (trace: any) => `${trace.id}`,
|
|
},
|
|
{
|
|
columnDef: 'command',
|
|
header: 'Comando',
|
|
cell: (trace: any) => `${trace.command?.name}`
|
|
},
|
|
{
|
|
columnDef: 'client',
|
|
header: 'Client',
|
|
cell: (trace: any) => `${trace.client?.name}`
|
|
},
|
|
{
|
|
columnDef: 'status',
|
|
header: 'Estado',
|
|
cell: (trace: any) => `${trace.status}`
|
|
},
|
|
{
|
|
columnDef: 'jobId',
|
|
header: 'Hilo de trabajo',
|
|
cell: (trace: any) => `${trace.jobId}`
|
|
},
|
|
{
|
|
columnDef: 'executedAt',
|
|
header: 'Programación de ejecución',
|
|
cell: (trace: any) => `${this.datePipe.transform(trace.executedAt, 'dd/MM/yyyy hh:mm:ss')}`,
|
|
},
|
|
{
|
|
columnDef: 'finishedAt',
|
|
header: 'Finalización',
|
|
cell: (trace: any) => `${this.datePipe.transform(trace.finishedAt, 'dd/MM/yyyy hh:mm:ss')}`,
|
|
},
|
|
];
|
|
displayedColumns = [...this.columns.map(column => column.columnDef)];
|
|
|
|
filters: { [key: string]: string } = {};
|
|
filteredClients!: Observable<any[]>;
|
|
clientControl = new FormControl();
|
|
filteredCommands!: Observable<any[]>;
|
|
commandControl = new FormControl();
|
|
|
|
constructor(private http: HttpClient) {}
|
|
|
|
ngOnInit(): void {
|
|
this.loadTraces();
|
|
this.loadCommands();
|
|
this.loadClients();
|
|
this.filteredCommands = this.commandControl.valueChanges.pipe(
|
|
startWith(''),
|
|
map(value => (typeof value === 'string' ? value : value?.name)),
|
|
map(name => (name ? this._filterCommands(name) : this.commands.slice()))
|
|
);
|
|
this.filteredClients = this.clientControl.valueChanges.pipe(
|
|
startWith(''),
|
|
map(value => (typeof value === 'string' ? value : value?.name)),
|
|
map(name => (name ? this._filterClients(name) : this.clients.slice()))
|
|
);
|
|
}
|
|
|
|
private _filterClients(name: string): any[] {
|
|
const filterValue = name.toLowerCase();
|
|
return this.clients.filter(client => client.name.toLowerCase().includes(filterValue));
|
|
}
|
|
|
|
private _filterCommands(name: string): any[] {
|
|
const filterValue = name.toLowerCase();
|
|
return this.commands.filter(command => command.name.toLowerCase().includes(filterValue));
|
|
}
|
|
|
|
displayFnClient(client: any): string {
|
|
return client && client.name ? client.name : '';
|
|
}
|
|
|
|
displayFnCommand(command: any): string {
|
|
return command && command.name ? command.name : '';
|
|
}
|
|
|
|
onOptionCommandSelected(selectedCommand: any): void {
|
|
this.filters['command.id'] = selectedCommand.id;
|
|
this.loadTraces();
|
|
}
|
|
|
|
onOptionClientSelected(selectedClient: any): void {
|
|
this.filters['client.id'] = selectedClient.id;
|
|
this.loadTraces();
|
|
}
|
|
|
|
loadTraces(): void {
|
|
this.loading = true;
|
|
const url = `${this.baseUrl}/traces?page=${this.page + 1}&itemsPerPage=${this.itemsPerPage}`;
|
|
this.http.get<any>(url, { params: this.filters }).subscribe(
|
|
(data) => {
|
|
this.traces = data['hydra:member'];
|
|
this.length = data['hydra:totalItems'];
|
|
this.groupedTraces = this.groupByCommandId(this.traces);
|
|
this.loading = false;
|
|
},
|
|
(error) => {
|
|
console.error('Error fetching traces', error);
|
|
this.loading = false;
|
|
}
|
|
);
|
|
}
|
|
|
|
loadCommands() {
|
|
this.loading = true;
|
|
this.http.get<any>(`${this.baseUrl}/commands?&page=1&itemsPerPage=10000`).subscribe(
|
|
response => {
|
|
this.commands = response['hydra:member'];
|
|
this.loading = false;
|
|
},
|
|
error => {
|
|
console.error('Error fetching commands:', error);
|
|
this.loading = false;
|
|
}
|
|
);
|
|
}
|
|
|
|
loadClients() {
|
|
this.loading = true;
|
|
this.http.get<any>(`${this.baseUrl}/clients?&page=1&itemsPerPage=10000`).subscribe(
|
|
response => {
|
|
this.clients = response['hydra:member'];
|
|
this.loading = false;
|
|
},
|
|
error => {
|
|
console.error('Error fetching clients:', error);
|
|
this.loading = false;
|
|
}
|
|
);
|
|
}
|
|
|
|
resetFilters() {
|
|
this.loading = true;
|
|
this.filters = {};
|
|
this.loadTraces();
|
|
}
|
|
|
|
groupByCommandId(traces: any[]): any[] {
|
|
const grouped: { [key: string]: any[] } = {};
|
|
|
|
traces.forEach(trace => {
|
|
const commandId = trace.command.id;
|
|
if (!grouped[commandId]) {
|
|
grouped[commandId] = [];
|
|
}
|
|
grouped[commandId].push(trace);
|
|
});
|
|
|
|
return Object.keys(grouped).map(key => ({
|
|
commandId: key,
|
|
traces: grouped[key]
|
|
}));
|
|
}
|
|
|
|
onPageChange(event: any): void {
|
|
this.page = event.pageIndex;
|
|
this.itemsPerPage = event.pageSize;
|
|
this.length = event.length;
|
|
this.loadTraces();
|
|
}
|
|
}
|