diff --git a/CHANGELOG.md b/CHANGELOG.md index 41c7f15..c276e9c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [1.20.0] - 2026-10-26 + +### Added +- **Soporte de Estados y Badges a Nivel de Partición en Plugins (`PluginService`, `groups.component`)**: + - Incorporada gestión granular de estados por partición (`${plugin}:${clientId}:${disk}:${partition}`). + - En eventos Mercure con `status === 'NONE'` en una partición específica, se limpia la clave de la partición y cualquier estado transitorio global obsoleto (`REMOVING`, `CHECKING`, etc.), permitiendo que `getClientBadges` evalúe de inmediato y preserve el badge activo de cualquier otra partición protegida del equipo. + - Soporte de invalidación granular por disco y partición en eventos de imagen y particionado. + ## [1.19.0] - 2026-10-23 ### Added diff --git a/ogWebconsole/package.json b/ogWebconsole/package.json index 2a1171a..4ace8a4 100644 --- a/ogWebconsole/package.json +++ b/ogWebconsole/package.json @@ -1,6 +1,6 @@ { "name": "og-webconsole", - "version": "1.19.0", + "version": "1.20.0", "scripts": { "ng": "ng", "start": "ng serve", diff --git a/ogWebconsole/src/app/services/plugin.service.ts b/ogWebconsole/src/app/services/plugin.service.ts index a9f52fb..528a405 100644 --- a/ogWebconsole/src/app/services/plugin.service.ts +++ b/ogWebconsole/src/app/services/plugin.service.ts @@ -156,6 +156,10 @@ export class PluginService { const idStr = String(data.clientId); if (disk !== undefined && disk !== null && part !== undefined && part !== null) { this.clientPluginStatusMap.delete(this.getPartitionStatusKey(data.plugin, idStr, Number(disk), Number(part))); + const curGlobal = this.clientPluginStatusMap.get(this.getStatusKey(data.plugin, idStr)); + if (curGlobal && ['REMOVING', 'CHECKING', 'FREEZING', 'UNFREEZING'].includes(curGlobal.toUpperCase())) { + this.clientPluginStatusMap.delete(this.getStatusKey(data.plugin, idStr)); + } } else if (disk !== undefined && disk !== null) { clearEntriesForPrefix(`${data.plugin}:${idStr}:${disk}:`); } else { @@ -167,6 +171,10 @@ export class PluginService { const uuidStr = data.clientUuid; if (disk !== undefined && disk !== null && part !== undefined && part !== null) { this.clientPluginStatusMap.delete(this.getPartitionStatusKey(data.plugin, uuidStr, Number(disk), Number(part))); + const curGlobal = this.clientPluginStatusMap.get(this.getStatusKey(data.plugin, uuidStr)); + if (curGlobal && ['REMOVING', 'CHECKING', 'FREEZING', 'UNFREEZING'].includes(curGlobal.toUpperCase())) { + this.clientPluginStatusMap.delete(this.getStatusKey(data.plugin, uuidStr)); + } } else if (disk !== undefined && disk !== null) { clearEntriesForPrefix(`${data.plugin}:${uuidStr}:${disk}:`); } else {