diff --git a/CHANGELOG.md b/CHANGELOG.md
index 17ab0be..b68ea6a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,8 +5,9 @@
### Added
- **Soporte Dinámico para Plugins (`PluginService`, `PluginsComponent`, `PluginSettingsComponent`)**:
- Incorporada infraestructura agnóstica para descubrimiento y gestión de plugins desacoplados a través de `/api/plugins`.
- - Inyección dinámica de comandos personalizados en la consola de comandos (`execute-command`) según los plugins instalados.
- - Generador dinámico de formularios de configuración basados en esquemas JSON (`app-plugin-settings`) con soporte para textos, números, selectores, casillas y scripts.
+ - Agrupación ordenada de comandos de plugins en submenús dedicados en la consola de comandos (`execute-command`), organizados por plugin para mantener el menú limpio.
+ - Comprobación y filtrado dinámico de compatibilidad por Sistema Operativo (`os: ['windows']`), deshabilitando automáticamente los comandos en puestos con sistemas incompatibles.
+ - Generador dinámico de formularios de configuración basados en esquemas JSON (`app-plugin-settings`) con botón de autogeneración y actualización reactiva de scripts según los parámetros seleccionados.
- Soporte de insignias de estado (badges) contextuales por cliente en las vistas de mosaico y lista de equipos (`groups.component`).
- Nuevo elemento condicional "Plugins" en el menú lateral (`sidebar`), visible únicamente cuando existen plugins activos en el sistema.
- Comportamiento 100% neutro e idéntico a 1.15.0 si no hay plugins instalados.
diff --git a/ogWebconsole/src/app/components/commands/main-commands/execute-command/execute-command.component.html b/ogWebconsole/src/app/components/commands/main-commands/execute-command/execute-command.component.html
index 119a584..03ef622 100644
--- a/ogWebconsole/src/app/components/commands/main-commands/execute-command/execute-command.component.html
+++ b/ogWebconsole/src/app/components/commands/main-commands/execute-command/execute-command.component.html
@@ -27,4 +27,27 @@
{{ command.translationKey ? (command.translationKey | translate) : (command.label || command.slug) }}
}
+
+ @if (pluginGroups.length > 0) {
+
+ @for (group of pluginGroups; track group.plugin.name) {
+
+
+
+ @for (cmd of group.commands; track cmd.slug) {
+
+ }
+
+ }
+ }
\ No newline at end of file
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 a3b2574..768155b 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
@@ -65,14 +65,15 @@ export class ExecuteCommandComponent implements OnInit {
this.baseUrl = this.configService.apiUrl;
}
+ pluginGroups: any[] = [];
+
ngOnInit(): void {
this.clientData = this.clientData || [];
const allowed = this.getAllowedCommandsByRole();
this.arrayCommands = this.arrayCommands.filter(c => allowed.includes(c.slug));
- // Punto de anclaje para comandos aportados por plugins
- const pluginCmds = this.pluginService.getCommands();
- this.arrayCommands = [...this.arrayCommands, ...pluginCmds];
+ // Punto de anclaje para grupos de comandos aportados por plugins
+ this.pluginGroups = this.pluginService.getPluginGroups();
this.updateCommandStates();
}
@@ -162,6 +163,14 @@ export class ExecuteCommandComponent implements OnInit {
return command;
});
+
+ if (this.pluginGroups && this.pluginGroups.length > 0) {
+ for (const group of this.pluginGroups) {
+ for (const cmd of group.commands) {
+ cmd.disabled = !hasClients || !this.pluginService.isCommandSupportedForClients(cmd, this.clientData);
+ }
+ }
+ }
}
onCommandSelect(action: any): void {
diff --git a/ogWebconsole/src/app/components/plugins/plugin-settings/plugin-settings.component.css b/ogWebconsole/src/app/components/plugins/plugin-settings/plugin-settings.component.css
index 3e9a8ba..d42aac9 100644
--- a/ogWebconsole/src/app/components/plugins/plugin-settings/plugin-settings.component.css
+++ b/ogWebconsole/src/app/components/plugins/plugin-settings/plugin-settings.component.css
@@ -194,7 +194,7 @@
border-top: 1px solid #e2e8f0;
}
-.btn-save, .btn-reset {
+.btn-save, .btn-reset, .btn-regenerate {
display: flex;
align-items: center;
gap: 8px;
diff --git a/ogWebconsole/src/app/components/plugins/plugin-settings/plugin-settings.component.html b/ogWebconsole/src/app/components/plugins/plugin-settings/plugin-settings.component.html
index 768d788..c1b71cb 100644
--- a/ogWebconsole/src/app/components/plugins/plugin-settings/plugin-settings.component.html
+++ b/ogWebconsole/src/app/components/plugins/plugin-settings/plugin-settings.component.html
@@ -82,6 +82,12 @@
restart_alt
Restaurar por defecto
+ @if (hasScriptFields()) {
+
+ }