From df3ff55fb8752b9ff410b4fa5c18b17e6856e506 Mon Sep 17 00:00:00 2001 From: Nicolas Arenas Date: Fri, 8 May 2026 07:14:06 +0200 Subject: [PATCH] feat(oggui): ask to queue reboot/poweroff if client is busy Show a confirmation modal before sending reboot and poweroff requests, allowing the user to choose whether to queue the command when the client is busy (HTTP 409). Passes the 'queue' flag to the API accordingly. --- .../execute-command.component.ts | 47 +++++++++++-------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/ogWebconsole/src/app/components/commands/main-commands/execute-command/execute-command.component.ts b/ogWebconsole/src/app/components/commands/main-commands/execute-command/execute-command.component.ts index fffa346..876b557 100644 --- a/ogWebconsole/src/app/components/commands/main-commands/execute-command/execute-command.component.ts +++ b/ogWebconsole/src/app/components/commands/main-commands/execute-command/execute-command.component.ts @@ -10,6 +10,7 @@ import { MatDialog } from "@angular/material/dialog"; import { RemoveCacheImageComponent } from "./remove-cache-image/remove-cache-image.component"; import { AuthService } from '@services/auth.service'; import {SoftwareProfilePartitionComponent} from "./software-profile-partition/software-profile-partition.component"; +import { QueueConfirmationModalComponent } from '../../../../shared/queue-confirmation-modal/queue-confirmation-modal.component'; @Component({ selector: 'app-execute-command', @@ -196,16 +197,19 @@ export class ExecuteCommandComponent implements OnInit { } rebootClient(): void { - this.http.post(`${this.baseUrl}/clients/server/reboot`, { - clients: this.clientData.map((client: any) => client['@id']) - }).subscribe( - response => { - this.toastService.success(this.translate.instant('clientUpdatedSuccessfully')); - }, - error => { - this.toastService.error(error.error['hydra:description'] || 'Error de conexión con el cliente'); - } - ); + const dialogRef = this.dialog.open(QueueConfirmationModalComponent, { width: '400px' }); + + dialogRef.afterClosed().subscribe((queue: boolean | undefined) => { + if (queue === undefined) return; + + this.http.post(`${this.baseUrl}/clients/server/reboot`, { + clients: this.clientData.map((client: any) => client['@id']), + queue + }).subscribe( + () => { this.toastService.success(this.translate.instant('clientUpdatedSuccessfully')); }, + (error: any) => { this.toastService.error(error.error['hydra:description'] || 'Error de conexión con el cliente'); } + ); + }); } refreshClient(): void { @@ -332,16 +336,19 @@ export class ExecuteCommandComponent implements OnInit { } powerOffClient(): void { - this.http.post(`${this.baseUrl}/clients/server/power-off`, { - clients: this.clientData.map((client: any) => client['@id']) - }).subscribe( - response => { - this.toastService.success(this.translate.instant('shutdownRequestSentCorrectly')); - }, - error => { - this.toastService.error(error.error['hydra:description'] || 'Error de conexión con el cliente'); - } - ); + const dialogRef = this.dialog.open(QueueConfirmationModalComponent, { width: '400px' }); + + dialogRef.afterClosed().subscribe((queue: boolean | undefined) => { + if (queue === undefined) return; + + this.http.post(`${this.baseUrl}/clients/server/power-off`, { + clients: this.clientData.map((client: any) => client['@id']), + queue + }).subscribe( + () => { this.toastService.success(this.translate.instant('shutdownRequestSentCorrectly')); }, + (error: any) => { this.toastService.error(error.error['hydra:description'] || 'Error de conexión con el cliente'); } + ); + }); } openPartitionAssistant(): void {