import {Component, Input, OnInit} from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { HttpClient } from '@angular/common/http'; import { MatTableDataSource } from '@angular/material/table'; import { ToastrService } from 'ngx-toastr'; import { DatePipe } from '@angular/common'; import { CreateImageComponent } from './create-image/create-image.component'; import {DeleteModalComponent} from "../../shared/delete_modal/delete-modal/delete-modal.component"; import {ServerInfoDialogComponent} from "../ogdhcp/og-dhcp-subnets/server-info-dialog/server-info-dialog.component"; import {Observable} from "rxjs"; import { JoyrideService } from 'ngx-joyride'; import {ExportImageComponent} from "./export-image/export-image.component"; @Component({ selector: 'app-images', templateUrl: './images.component.html', styleUrls: ['./images.component.css'] }) export class ImagesComponent implements OnInit { baseUrl: string = import.meta.env.NG_APP_BASE_API_URL; dataSource = new MatTableDataSource(); length: number = 0; itemsPerPage: number = 10; page: number = 0; loading: boolean = false; filters: { [key: string]: string } = {}; alertMessage: string | null = null; datePipe: DatePipe = new DatePipe('es-ES'); columns = [ { columnDef: 'id', header: 'Id', cell: (image: any) => `${image.id}` }, { columnDef: 'name', header: 'Nombre de imagen', cell: (image: any) => `${image.name}` }, { columnDef: 'imageRepository', header: 'Repositorio', cell: (image: any) => `${image.imageRepository?.name}` }, { columnDef: 'remotePc', header: 'Remote Pc', cell: (image: any) => `${image.remotePc}` }, { columnDef: 'isGlobal', header: 'Imagen Global', cell: (image: any) => `${image.isGlobal}` }, { columnDef: 'status', header: 'Estado', cell: (image: any) => `${image.status}` }, { columnDef: 'imageFullsum', header: 'Fullsum', cell: (image: any) => `${image.imageFullsum}` }, { columnDef: 'createdAt', header: 'Fecha de creación', cell: (image: any) => `${this.datePipe.transform(image.createdAt, 'dd/MM/yyyy hh:mm:ss')}` } ]; displayedColumns = [...this.columns.map(column => column.columnDef), 'actions']; private apiUrl = `${this.baseUrl}/images`; @Input() repositoryUuid: any private repositoryId: any; constructor( public dialog: MatDialog, private http: HttpClient, private toastService: ToastrService, private joyrideService: JoyrideService, ) {} ngOnInit(): void { if (this.repositoryUuid) { this.loadRepository() } else { this.search(); } } loadRepository(): void { this.http.get(`${this.baseUrl}/image-repositories/${this.repositoryUuid}`, {}).subscribe( data => { this.repositoryId = data.id; this.search(); }, error => { console.error('Error fetching image repositories', error); } ) } getStatusLabel(status: string): string { switch (status) { case 'pending': return 'Pendiente'; case 'in-progress': return 'En progreso'; case 'aux-file-pending': return 'Archivos auxiliares pendientes'; case 'success': return 'Creado con éxito'; case 'trash': return 'Papelera temporal'; case 'failed': return 'Fallido'; default: return 'Estado desconocido'; } } addImage(): void { const dialogRef = this.dialog.open(CreateImageComponent, { width: '800px' }); dialogRef.afterClosed().subscribe(() => { this.search(); }); } search(): void { this.loading = true; this.http.get(`${this.apiUrl}?page=${this.page +1 }&itemsPerPage=${this.itemsPerPage}&repository.id=${this.repositoryId}`, { params: this.filters }).subscribe( data => { this.dataSource.data = data['hydra:member']; this.length = data['hydra:totalItems']; this.loading = false; }, error => { console.error('Error fetching images', error); this.loading = false; } ); } editImage(event: MouseEvent, image: any): void { event.stopPropagation(); this.dialog.open(CreateImageComponent, { width: '800px', data: image['@id'] }).afterClosed().subscribe(() => this.search()); } deleteImage(event: MouseEvent,command: any): void { event.stopPropagation(); this.dialog.open(DeleteModalComponent, { width: '300px', data: { name: command.name }, }).afterClosed().subscribe((result) => { if (result) { this.http.delete(`${this.apiUrl}/${command.uuid}`).subscribe({ next: () => { this.toastService.success('Imagen eliminada con éxito'); this.search(); }, error: (error) => { console.error('Error al eliminar la imagen:', error); } }); } }); } onPageChange(event: any): void { this.page = event.pageIndex; this.itemsPerPage = event.pageSize; this.length = event.length; this.search(); } loadImageAlert(image: any): Observable { return this.http.get(`${this.apiUrl}/server/${image.uuid}/get`, {}); } showImageInfo(event: MouseEvent, image:any) { event.stopPropagation(); this.loadImageAlert(image).subscribe( response => { this.alertMessage = response.output; this.dialog.open(ServerInfoDialogComponent, { width: '600px', data: { message: this.alertMessage } }); }, error => { this.toastService.error(error.error['hydra:description']); } ); } toggleAction(image: any, action:string): void { switch (action) { case 'get-aux': this.http.post(`${this.baseUrl}/images/server/${image.uuid}/create-aux-files`, {}).subscribe({ next: () => { this.toastService.success('Petición de creación de archivos auxiliares enviada'); this.search() }, error: (error) => { this.toastService.error(error.error['hydra:description']); } }); break; case 'delete-trash': this.http.post(`${this.baseUrl}/images/server/${image.uuid}/delete-trash`, {}).subscribe({ next: () => { this.toastService.success('Petición de eliminación de la papelera temporal enviada'); this.search() }, error: (error) => { this.toastService.error(error.error['hydra:description']); } }); break; case 'delete-permanent': this.http.post(`${this.baseUrl}/images/server/${image.uuid}/delete-permanent`, {}).subscribe({ next: () => { this.toastService.success('Petición de eliminación de la papelera temporal enviada'); this.search() }, error: (error) => { this.toastService.error(error.error['hydra:description']); } }); break; case 'recover': this.http.post(`${this.baseUrl}/images/server/${image.uuid}/recover`, {}).subscribe({ next: () => { this.toastService.success('Petición de recuperación de la imagen enviada'); this.search() }, error: (error) => { this.toastService.error(error.error['hydra:description']); } }); break; case 'export': this.dialog.open(ExportImageComponent, { width: '600px', data: { image: image } }); break; default: console.error('Acción no soportada:', action); break; } } iniciarTour(): void { this.joyrideService.startTour({ steps: [ 'imagesTitleStep', 'addImageButton', 'searchImagesField', 'imagesTable', 'actionsHeader', 'editImageButton', 'deleteImageButton', 'imagesPagination' ], showPrevButton: true, themeColor: '#3f51b5' }); } }