i18n: anadir traducciones en es, en y cat para gestion de roles y funciones en plugins (v1.24.0)
oggui-debian-package/pipeline/tag This commit looks good Details

main 1.24.0
Juan Manuel Bardallo 2026-10-28 20:18:29 +01:00
parent b6007ecf8a
commit b2237d7630
6 changed files with 85 additions and 21 deletions

View File

@ -10,6 +10,7 @@
- La personalización se persiste en la base de datos dentro de `configData.command_roles` de forma 100% desacoplada sin requerir alteraciones en el esquema backend.
- En `PluginService.getPluginGroups()`, los comandos disponibles en los menús de acción (`ExecuteCommandComponent`) se filtran reactivamente en función del rol y permisos del usuario autenticado, ocultando totalmente aquellas opciones que no le correspondan (ej. un conserje con perfil básico solo visualiza Reservar, Liberar y Renovar puesto, permaneciendo invisibles las funciones de instalación o mantenimiento).
- Total adhesión a la sintaxis moderna de control de flujo Angular (`@if`, `@for`) y diseño modular de estilos CSS sin atributos inline.
- Soporte de internacionalización integral (`@ngx-translate`) con catálogos actualizados en español (`es.json`), inglés (`en.json`) y catalán (`cat.json`) para todos los textos, pestañas, cabeceras y notificaciones toast de la configuración de roles.
## [1.23.0] - 2026-10-27

View File

@ -15,11 +15,11 @@
class="plugin-status-toggle"
[class.active]="plugin.enabled"
[class.inactive]="!plugin.enabled">
{{ plugin.enabled ? 'Activo' : 'Inactivo' }}
{{ plugin.enabled ? ('active' | translate) : ('inactive' | translate) }}
</mat-slide-toggle>
</div>
<p class="plugin-description">{{ plugin.descriptionKey ? (plugin.descriptionKey | translate) : plugin.description }}</p>
<span class="plugin-author">Autor: {{ plugin.author }}</span>
<span class="plugin-author">{{ 'pluginSettingsAuthor' | translate }}: {{ plugin.author }}</span>
</div>
</div>
@ -32,7 +32,7 @@
[class.active]="activeSubTab === 'settings'"
(click)="setSubTab('settings')">
<mat-icon class="subtab-nav-icon">tune</mat-icon>
<span>Configuración</span>
<span>{{ 'pluginSettingsConfigTab' | translate }}</span>
</button>
@if (plugin.commands && plugin.commands.length > 0) {
@ -42,7 +42,7 @@
[class.active]="activeSubTab === 'permissions'"
(click)="setSubTab('permissions')">
<mat-icon class="subtab-nav-icon">admin_panel_settings</mat-icon>
<span>Funciones y Roles</span>
<span>{{ 'pluginSettingsRolesTab' | translate }}</span>
<span class="subtab-counter-badge">{{ plugin.commands.length }}</span>
</button>
}
@ -54,7 +54,7 @@
[class.active]="activeSubTab === 'records'"
(click)="setSubTab('records')">
<mat-icon class="subtab-nav-icon">history</mat-icon>
<span>Historial y Registros</span>
<span>{{ 'pluginSettingsRecordsTab' | translate }}</span>
@if (recordsTotal > 0) {
<span class="subtab-counter-badge">{{ recordsTotal }}</span>
}
@ -68,17 +68,17 @@
<div class="section-header-row">
<div class="section-title-box">
<mat-icon class="section-icon">tune</mat-icon>
<h3 class="section-heading">Parámetros de Configuración del Plugin</h3>
<h3 class="section-heading">{{ 'pluginSettingsParamsHeading' | translate }}</h3>
</div>
<div class="form-actions-bar top-actions">
<button mat-stroked-button color="warn" (click)="reset()" class="btn-reset">
<mat-icon>restart_alt</mat-icon>
Restaurar por defecto
{{ 'pluginSettingsRestoreDefaults' | translate }}
</button>
<button mat-raised-button color="primary" (click)="save()" class="btn-save">
<mat-icon>save</mat-icon>
Guardar Configuración
{{ 'pluginSettingsSaveConfig' | translate }}
</button>
</div>
</div>
@ -191,23 +191,23 @@
<div class="section-header-row">
<div class="section-title-box">
<mat-icon class="section-icon">admin_panel_settings</mat-icon>
<h3 class="section-heading">Control de Acceso a Funciones por Rol</h3>
<h3 class="section-heading">{{ 'pluginSettingsRolesHeading' | translate }}</h3>
</div>
<div class="form-actions-bar top-actions">
<button mat-stroked-button color="warn" (click)="resetRoles()" class="btn-reset">
<mat-icon>restart_alt</mat-icon>
Restaurar por defecto
{{ 'pluginSettingsRestoreDefaults' | translate }}
</button>
<button mat-raised-button color="primary" (click)="saveRoles()" class="btn-save" [disabled]="!hasRoleChanges">
<mat-icon>save</mat-icon>
Guardar Permisos
{{ 'pluginSettingsSaveRoles' | translate }}
</button>
</div>
</div>
<p class="roles-intro-text">
Configura qué roles de usuario tienen autorización para visualizar y ejecutar cada una de las funciones expuestas por este plugin. Los usuarios que no pertenezcan a los roles seleccionados no verán la opción disponible en el menú de acciones de la consola.
{{ 'pluginSettingsRolesDesc' | translate }}
</p>
<div class="roles-matrix-card">
@ -215,7 +215,7 @@
<table class="roles-matrix-table">
<thead>
<tr>
<th class="col-command-header">Función / Acción del Plugin</th>
<th class="col-command-header">{{ 'pluginSettingsColCommand' | translate }}</th>
@for (role of availableRoles; track role.key) {
<th class="col-role-header">
<div class="role-header-content">
@ -248,7 +248,7 @@
[disabled]="role.key === 'ROLE_SUPER_ADMIN'"
(change)="toggleRole(cmd.slug, role.key, $event.checked)"
color="primary"
[title]="role.key === 'ROLE_SUPER_ADMIN' ? 'Super Admin siempre tiene acceso total' : ('Permitir a ' + role.name)">
[title]="role.key === 'ROLE_SUPER_ADMIN' ? ('pluginSettingsSuperAdminFullAccess' | translate) : ('pluginSettingsAllowRole' | translate:{ role: role.name })">
</mat-checkbox>
</td>
}

View File

@ -134,7 +134,7 @@ export class PluginSettingsComponent implements OnInit, OnChanges, OnDestroy {
if (!this.pluginName) return;
this.pluginService.savePluginCommandRoles(this.pluginName, this.commandRoles);
this.hasRoleChanges = false;
this.toast.success('Permisos de funciones por rol actualizados correctamente', this.plugin?.title || 'Plugin');
this.toast.success(this.translate.instant('pluginSettingsRolesSaved'), this.plugin?.title || 'Plugin');
}
resetRoles(): void {
@ -147,7 +147,7 @@ export class PluginSettingsComponent implements OnInit, OnChanges, OnDestroy {
}
this.commandRoles = map;
this.hasRoleChanges = true;
this.toast.info('Permisos restaurados a valores por defecto del plugin', this.plugin?.title || 'Plugin');
this.toast.info(this.translate.instant('pluginSettingsRolesReset'), this.plugin?.title || 'Plugin');
this.cdr.markForCheck();
}
@ -159,11 +159,11 @@ export class PluginSettingsComponent implements OnInit, OnChanges, OnDestroy {
}
this.pluginService.togglePlugin(this.pluginName, checked).subscribe({
next: () => {
const statusText = checked ? 'activado' : 'desactivado';
this.toast.success(`Plugin ${statusText} correctamente`, this.plugin?.title || 'Plugin');
const statusKey = checked ? 'pluginSettingsPluginActivated' : 'pluginSettingsPluginDeactivated';
this.toast.success(this.translate.instant(statusKey), this.plugin?.title || 'Plugin');
},
error: () => {
this.toast.error('Error al cambiar el estado del plugin', this.plugin?.title || 'Plugin');
this.toast.error(this.translate.instant('pluginSettingsToggleError'), this.plugin?.title || 'Plugin');
this.loadPluginData();
}
});
@ -270,13 +270,13 @@ export class PluginSettingsComponent implements OnInit, OnChanges, OnDestroy {
save(): void {
if (!this.pluginName) return;
this.pluginService.savePluginConfig(this.pluginName, this.configData);
this.toast.success('Configuración guardada correctamente', this.plugin?.title || 'Plugin');
this.toast.success(this.translate.instant('pluginSettingsConfigSaved'), this.plugin?.title || 'Plugin');
}
reset(): void {
if (!this.pluginName) return;
this.configData = this.pluginService.resetPluginConfig(this.pluginName);
this.toast.info('Configuración restaurada a valores por defecto', this.plugin?.title || 'Plugin');
this.toast.info(this.translate.instant('pluginSettingsConfigReset'), this.plugin?.title || 'Plugin');
}
setSubTab(tab: string): void {

View File

@ -2,6 +2,27 @@
"plugins": "Plugins",
"pluginsTitle": "Plugins i Extensions",
"pluginsDescription": "Gestió i personalització de mòduls instal·lats a OpenGnsys",
"pluginSettingsConfigTab": "Configuració",
"pluginSettingsRolesTab": "Funcions i Rols",
"pluginSettingsRecordsTab": "Historial i Registres",
"pluginSettingsParamsHeading": "Paràmetres de Configuració del Plugin",
"pluginSettingsRestoreDefaults": "Restaurar per defecte",
"pluginSettingsSaveConfig": "Desar Configuració",
"pluginSettingsRolesHeading": "Control d'Accés a Funcions per Rol",
"pluginSettingsSaveRoles": "Desar Permisos",
"pluginSettingsRolesDesc": "Configura quins rols d'usuari tenen autorització per visualitzar i executar cadascuna de les funcions exposades per aquest plugin. Els usuaris que no pertanyin als rols seleccionats no veuran l'opció disponible al menú d'accions de la consola.",
"pluginSettingsColCommand": "Funció / Acció del Plugin",
"pluginSettingsSuperAdminFullAccess": "Super Admin sempre té accés total",
"pluginSettingsAllowRole": "Permetre a {{ role }}",
"pluginSettingsRolesSaved": "Permisos de funcions per rol actualitzats correctament",
"pluginSettingsRolesReset": "Permisos restaurats als valors per defecte del plugin",
"pluginSettingsConfigSaved": "Configuració desada correctament",
"pluginSettingsConfigReset": "Configuració restaurada als valors per defecte",
"pluginSettingsPluginActivated": "Plugin activat correctament",
"pluginSettingsPluginDeactivated": "Plugin desactivat correctament",
"pluginSettingsToggleError": "Error en canviar l'estat del plugin",
"pluginSettingsAuthor": "Autor",
"pluginSettingsEmptyGroup": "Aquest plugin no requereix paràmetres addicionals de configuració.",
"imageCloning": "Imatge / Clonació",
"labelDeployed": "Desplegada",
"actionAddedSuccess": "Acció afegida correctament",

View File

@ -2,6 +2,27 @@
"plugins": "Plugins",
"pluginsTitle": "Plugins & Extensions",
"pluginsDescription": "Manage and customize modules installed on OpenGnsys",
"pluginSettingsConfigTab": "Configuration",
"pluginSettingsRolesTab": "Roles & Functions",
"pluginSettingsRecordsTab": "History & Records",
"pluginSettingsParamsHeading": "Plugin Configuration Parameters",
"pluginSettingsRestoreDefaults": "Restore defaults",
"pluginSettingsSaveConfig": "Save Configuration",
"pluginSettingsRolesHeading": "Role-Based Function Access Control",
"pluginSettingsSaveRoles": "Save Permissions",
"pluginSettingsRolesDesc": "Configure which user roles are authorized to view and execute each function exposed by this plugin. Users without permission will not see the option in the console action menu.",
"pluginSettingsColCommand": "Plugin Function / Action",
"pluginSettingsSuperAdminFullAccess": "Super Admin always has full access",
"pluginSettingsAllowRole": "Allow {{ role }}",
"pluginSettingsRolesSaved": "Function permissions by role updated successfully",
"pluginSettingsRolesReset": "Permissions restored to plugin defaults",
"pluginSettingsConfigSaved": "Configuration saved successfully",
"pluginSettingsConfigReset": "Configuration restored to defaults",
"pluginSettingsPluginActivated": "Plugin activated successfully",
"pluginSettingsPluginDeactivated": "Plugin deactivated successfully",
"pluginSettingsToggleError": "Error changing plugin status",
"pluginSettingsAuthor": "Author",
"pluginSettingsEmptyGroup": "This plugin does not require additional configuration parameters.",
"imageCloning": "Image / Cloning",
"labelDeployed": "Deployed",
"actionAddedSuccess": "Action added successfully",

View File

@ -2,6 +2,27 @@
"plugins": "Plugins",
"pluginsTitle": "Plugins y Extensiones",
"pluginsDescription": "Gestión y personalización de módulos instalados en OpenGnsys",
"pluginSettingsConfigTab": "Configuración",
"pluginSettingsRolesTab": "Funciones y Roles",
"pluginSettingsRecordsTab": "Historial y Registros",
"pluginSettingsParamsHeading": "Parámetros de Configuración del Plugin",
"pluginSettingsRestoreDefaults": "Restaurar por defecto",
"pluginSettingsSaveConfig": "Guardar Configuración",
"pluginSettingsRolesHeading": "Control de Acceso a Funciones por Rol",
"pluginSettingsSaveRoles": "Guardar Permisos",
"pluginSettingsRolesDesc": "Configura qué roles de usuario tienen autorización para visualizar y ejecutar cada una de las funciones expuestas por este plugin. Los usuarios que no pertenezcan a los roles seleccionados no verán la opción disponible en el menú de acciones de la consola.",
"pluginSettingsColCommand": "Función / Acción del Plugin",
"pluginSettingsSuperAdminFullAccess": "Super Admin siempre tiene acceso total",
"pluginSettingsAllowRole": "Permitir a {{ role }}",
"pluginSettingsRolesSaved": "Permisos de funciones por rol actualizados correctamente",
"pluginSettingsRolesReset": "Permisos restaurados a valores por defecto del plugin",
"pluginSettingsConfigSaved": "Configuración guardada correctamente",
"pluginSettingsConfigReset": "Configuración restaurada a valores por defecto",
"pluginSettingsPluginActivated": "Plugin activado correctamente",
"pluginSettingsPluginDeactivated": "Plugin desactivado correctamente",
"pluginSettingsToggleError": "Error al cambiar el estado del plugin",
"pluginSettingsAuthor": "Autor",
"pluginSettingsEmptyGroup": "Este plugin no requiere parámetros adicionales de configuración.",
"imageCloning": "Imagen / Clonación",
"labelDeployed": "Desplegada",
"actionAddedSuccess": "Acción añadida con éxito",