diff --git a/CHANGELOG.md b/CHANGELOG.md
index de0f83d..5ca2e76 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,19 @@
# Changelog
+## [1.15.0] - 2026-10-20
+
+### Added
+- **Ejecución y Encolado Automático en Clientes Offline (`execute-command`, `boot-so-partition`, `queue-confirmation-modal`)**:
+ - Permitida la ejecución de comandos y scripts (incluyendo inicio de sesión en partición / arranque de SO) sobre equipos apagados o grupos con estados mixtos.
+ - El modal de confirmación detecta automáticamente equipos apagados o estados no ejecutables de inmediato, pre-seleccionando la opción de encolado y mostrando avisos visuales informativos (disponible en ES, EN y CA).
+ - Unificada y estandarizada la matriz de estados de todos los comandos en la consola de comandos.
+
+### Fixed
+- **Selección de Clientes en Unidades Organizativas (`groups.component.html`)**: Solucionado el problema al invocar comandos o tareas desde el menú contextual de un Aula / OU donde solo se seleccionaban los equipos mostrados en la página actual de la tabla en lugar de todos los clientes pertenecientes a la OU.
+
+### Changed
+- **Refactorización Angular (`boot-so-partition`)**: Migradas directivas estructurales (`*ngIf`, `*ngFor`) a la sintaxis moderna de control de flujo (`@if`, `@for`) y extraídos los estilos inline a clases CSS reutilizables.
+
## [1.14.4] - 2026-10-09
### Fixed
diff --git a/ogWebconsole/src/app/components/commands/main-commands/execute-command/boot-so-partition/boot-so-partition.component.css b/ogWebconsole/src/app/components/commands/main-commands/execute-command/boot-so-partition/boot-so-partition.component.css
index 9f58e44..e952c03 100644
--- a/ogWebconsole/src/app/components/commands/main-commands/execute-command/boot-so-partition/boot-so-partition.component.css
+++ b/ogWebconsole/src/app/components/commands/main-commands/execute-command/boot-so-partition/boot-so-partition.component.css
@@ -99,6 +99,10 @@
box-shadow: 0px 0px 0px rgba(0,0,0,0.2);
}
+.section-divider {
+ margin-top: 20px;
+}
+
@media (max-width: 600px) {
.form-field {
width: 100%;
diff --git a/ogWebconsole/src/app/components/commands/main-commands/execute-command/boot-so-partition/boot-so-partition.component.html b/ogWebconsole/src/app/components/commands/main-commands/execute-command/boot-so-partition/boot-so-partition.component.html
index c6bc6b2..e46d9b3 100644
--- a/ogWebconsole/src/app/components/commands/main-commands/execute-command/boot-so-partition/boot-so-partition.component.html
+++ b/ogWebconsole/src/app/components/commands/main-commands/execute-command/boot-so-partition/boot-so-partition.component.html
@@ -1,66 +1,70 @@
diff --git a/ogWebconsole/src/app/shared/queue-confirmation-modal/queue-confirmation-modal.component.ts b/ogWebconsole/src/app/shared/queue-confirmation-modal/queue-confirmation-modal.component.ts
index 722873c..4884b0a 100644
--- a/ogWebconsole/src/app/shared/queue-confirmation-modal/queue-confirmation-modal.component.ts
+++ b/ogWebconsole/src/app/shared/queue-confirmation-modal/queue-confirmation-modal.component.ts
@@ -1,4 +1,4 @@
-import { Component, Inject } from '@angular/core';
+import { Component, Inject, OnInit } from '@angular/core';
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
@Component({
@@ -6,14 +6,36 @@ import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
templateUrl: './queue-confirmation-modal.component.html',
styleUrl: './queue-confirmation-modal.component.css'
})
-export class QueueConfirmationModalComponent {
+export class QueueConfirmationModalComponent implements OnInit {
shouldQueue: boolean = false;
+ allOff: boolean = false;
+ hasMixedStates: boolean = false;
+ onCount: number = 0;
+ offCount: number = 0;
+ totalCount: number = 0;
constructor(
public dialogRef: MatDialogRef,
@Inject(MAT_DIALOG_DATA) public data: any
) {}
+ ngOnInit(): void {
+ const clients: any[] = this.data?.clients || [];
+ if (clients.length > 0) {
+ this.totalCount = clients.length;
+ this.offCount = clients.filter(c => !c.status || c.status === 'off' || c.status === 'disconnected').length;
+ this.onCount = this.totalCount - this.offCount;
+
+ if (this.offCount === this.totalCount) {
+ this.allOff = true;
+ this.shouldQueue = true;
+ } else if (this.offCount > 0) {
+ this.hasMixedStates = true;
+ this.shouldQueue = true;
+ }
+ }
+ }
+
onNoClick(): void {
this.dialogRef.close();
}
diff --git a/ogWebconsole/src/locale/cat.json b/ogWebconsole/src/locale/cat.json
index 64b1edd..d030c2d 100644
--- a/ogWebconsole/src/locale/cat.json
+++ b/ogWebconsole/src/locale/cat.json
@@ -1169,6 +1169,8 @@
"pxeTemplateUpdatedSuccessfully": "Plantilla PXE actualitzada correctament",
"queueActions": "Encuar accions",
"queueActionsForFailedPcs": "Vols que s'encuin les accions per als PCs que no es pugui executar?",
+ "queueAllOffWarning": "Tots els equips seleccionats estan apagats o desconnectats. L'acció s'encolarà per executar-se quan arrenquin.",
+ "queueMixedStatesWarning": "Hi ha {{ on }} equips encesos i {{ off }} apagats o desconnectats. Es recomana encuar perquè els equips apagats executin l'acció en arrencar.",
"RamUsage": "Ús de RAM",
"readOnly": "Només Lectura",
"realTimeDhcpLogs": "Logs en temps real del servidor DHCP",
diff --git a/ogWebconsole/src/locale/en.json b/ogWebconsole/src/locale/en.json
index dacacea..1f5a0ad 100644
--- a/ogWebconsole/src/locale/en.json
+++ b/ogWebconsole/src/locale/en.json
@@ -1169,6 +1169,8 @@
"pxeTemplateUpdatedSuccessfully": "PXE template updated successfully",
"queueActions": "Queue actions",
"queueActionsForFailedPcs": "Do you want to queue actions for PCs that cannot execute?",
+ "queueAllOffWarning": "All selected computers are turned off or disconnected. The action will be queued to run when they start.",
+ "queueMixedStatesWarning": "There are {{ on }} computers on and {{ off }} turned off or disconnected. It is recommended to queue so that turned-off computers execute the action on startup.",
"RamUsage": "RAM Usage",
"readOnly": "Read Only",
"realTimeDhcpLogs": "Real-time DHCP server logs",
diff --git a/ogWebconsole/src/locale/es.json b/ogWebconsole/src/locale/es.json
index 3be2403..2321360 100644
--- a/ogWebconsole/src/locale/es.json
+++ b/ogWebconsole/src/locale/es.json
@@ -1169,6 +1169,8 @@
"pxeTemplateUpdatedSuccessfully": "Plantilla PXE actualizada con éxito",
"queueActions": "Encolar acciones",
"queueActionsForFailedPcs": "¿Quieres que se encolen las acciones para los PCs que no se pueda ejecutar?",
+ "queueAllOffWarning": "Todos los equipos seleccionados están apagados o desconectados. La acción se encolará para ejecutarse cuando arranquen.",
+ "queueMixedStatesWarning": "Hay {{ on }} equipos encendidos y {{ off }} apagados o desconectados. Se recomienda encolar para que los equipos apagados ejecuten la acción al encender.",
"RamUsage": "Uso de RAM",
"readOnly": "Solo Lectura",
"realTimeDhcpLogs": "Logs en tiempo real del servidor DHCP",