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; clientControl = new FormControl(); filteredCommands!: Observable; 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(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(`${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(`${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(); } }