From b359518d7d3fb72182ab559b75c9b6ab9dff930a Mon Sep 17 00:00:00 2001 From: Manuel Aranda Date: Tue, 21 Oct 2025 16:08:30 +0200 Subject: [PATCH] New version 1.2.0 --- CHANGELOG.md | 13 + ogWebconsole/src/app/app.module.ts | 2 + .../components/groups/groups.component.css | 24 ++ .../components/groups/groups.component.html | 24 +- .../app/components/groups/groups.component.ts | 70 +++- .../groups/services/data.service.ts | 14 + .../client-logs-modal.component.html | 2 +- .../delete-results-modal.component.css | 394 ++++++++++++++++++ .../delete-results-modal.component.html | 74 ++++ .../delete-results-modal.component.ts | 85 ++++ ogWebconsole/src/assets/config.json | 5 +- ogWebconsole/src/locale/en.json | 4 + ogWebconsole/src/locale/es.json | 6 +- 13 files changed, 702 insertions(+), 15 deletions(-) create mode 100644 ogWebconsole/src/app/components/groups/shared/delete-results-modal/delete-results-modal.component.css create mode 100644 ogWebconsole/src/app/components/groups/shared/delete-results-modal/delete-results-modal.component.html create mode 100644 ogWebconsole/src/app/components/groups/shared/delete-results-modal/delete-results-modal.component.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index c9ac362..2893fdd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,17 @@ # Changelog +## [1.2.0] - 2025-10-21 +### Added +- Se ha añadido una nueva funcionalidad la cual permite poder borrar varios equipos a la vez. + +### Improved +- Ahora no se pueden añadir equipos si no hay OUs creadas en el sistema. +- Ahora aparecen los logs del cliente en tiempo real en estados mas alla de "og-live". +- Se ha añadido el campo "mac" en el ogbrowser + +### Fixed +- Se ha corregido un error de sintaxis a la hora de cargar los iframe del ogLog. + +--- ## [1.1.0] - 2025-10-17 ### Added - Se han incorporado opciones para poder seleccionar tamaños de pantalla para visualizar en los menu ogBrowser diff --git a/ogWebconsole/src/app/app.module.ts b/ogWebconsole/src/app/app.module.ts index 1df101c..ab4e07b 100644 --- a/ogWebconsole/src/app/app.module.ts +++ b/ogWebconsole/src/app/app.module.ts @@ -36,6 +36,7 @@ import { MatDividerModule } from '@angular/material/divider'; import { MatStepperModule } from '@angular/material/stepper'; import { MatSlideToggleModule } from '@angular/material/slide-toggle'; import { DeleteModalComponent } from './shared/delete_modal/delete-modal/delete-modal.component'; +import { DeleteResultsModalComponent } from './components/groups/shared/delete-results-modal/delete-results-modal.component'; import { ClassroomViewComponent } from './components/groups/shared/classroom-view/classroom-view.component'; import { MatProgressSpinner } from "@angular/material/progress-spinner"; import { MatProgressBarModule } from '@angular/material/progress-bar'; @@ -198,6 +199,7 @@ registerLocaleData(localeEs, 'es-ES'); GroupsComponent, ManageClientComponent, DeleteModalComponent, + DeleteResultsModalComponent, QueueConfirmationModalComponent, ClassroomViewComponent, ClientViewComponent, diff --git a/ogWebconsole/src/app/components/groups/groups.component.css b/ogWebconsole/src/app/components/groups/groups.component.css index 722ad3e..6075acd 100644 --- a/ogWebconsole/src/app/components/groups/groups.component.css +++ b/ogWebconsole/src/app/components/groups/groups.component.css @@ -1742,3 +1742,27 @@ mat-button-toggle-group { } } +.delete-button { + background-color: #f44336 !important; + color: white !important; + display: flex; + align-items: center; + gap: 8px; +} + +.delete-button:hover:not(:disabled) { + background-color: #d32f2f !important; +} + +.delete-button:disabled { + background-color: #ffcdd2 !important; + color: #9e9e9e !important; + cursor: not-allowed; +} + +.delete-button mat-icon { + font-size: 18px; + width: 18px; + height: 18px; +} + diff --git a/ogWebconsole/src/app/components/groups/groups.component.html b/ogWebconsole/src/app/components/groups/groups.component.html index 741645d..64451eb 100644 --- a/ogWebconsole/src/app/components/groups/groups.component.html +++ b/ogWebconsole/src/app/components/groups/groups.component.html @@ -20,11 +20,14 @@ matTooltip="{{ 'newOrganizationalUnitTooltip' | translate }}" matTooltipShowDelay="1000"> {{ 'newOrganizationalUnitButton' | translate }} - - - + @@ -43,10 +46,10 @@ - - - - @@ -295,11 +298,16 @@ matTooltip="{{ 'moveClientsTooltip' | translate }}" matTooltipShowDelay="1000"> {{ 'changeOU' | translate }} +
+ @@ -418,7 +426,7 @@ pending_actions {{ 'colaAcciones' | translate }} - diff --git a/ogWebconsole/src/app/components/groups/groups.component.ts b/ogWebconsole/src/app/components/groups/groups.component.ts index 7bd3688..93d99ea 100644 --- a/ogWebconsole/src/app/components/groups/groups.component.ts +++ b/ogWebconsole/src/app/components/groups/groups.component.ts @@ -32,6 +32,7 @@ import {ChangeParentComponent} from "./shared/change-parent/change-parent.compon import { AuthService } from '@services/auth.service'; import { ClientPendingTasksComponent } from '../task-logs/client-pending-tasks/client-pending-tasks.component'; import { ClientLogsModalComponent } from './shared/client-logs-modal/client-logs-modal.component'; +import { DeleteResultsModalComponent } from './shared/delete-results-modal/delete-results-modal.component'; enum NodeType { OrganizationalUnit = 'organizational-unit', @@ -1228,6 +1229,10 @@ export class GroupsComponent implements OnInit, OnDestroy { return total; } + hasOrganizationalUnits(): boolean { + return this.originalTreeData && this.originalTreeData.length > 0; + } + getTotalClassrooms(): number { let total = 0; const countClassrooms = (nodes: TreeNode[]) => { @@ -1244,10 +1249,69 @@ export class GroupsComponent implements OnInit, OnDestroy { return total; } - // Función para actualizar estadísticas cuando cambian los datos private updateDashboardStats(): void { - // Las estadísticas de equipos ya se calculan en calculateLocalStats() - // Solo necesitamos asegurar que se actualicen cuando cambian los datos + this.calculateLocalStats(); } + + deleteMultipleClients(event: MouseEvent): void { + event.stopPropagation(); + + if (this.selection.selected.length === 0) { + this.toastr.warning('No hay clientes seleccionados para eliminar'); + return; + } + + const selectedClients = this.selection.selected; + const clientNames = selectedClients.map(client => client.name).join(', '); + + const dialogRef = this.dialog.open(DeleteModalComponent, { + width: '500px', + data: { + name: `${selectedClients.length} cliente${selectedClients.length > 1 ? 's' : ''}`, + message: `¿Está seguro de que desea eliminar los siguientes clientes?\n\n${clientNames}`, + isMultiple: true + }, + }); + + dialogRef.afterClosed().subscribe((result) => { + if (result === true) { + this.performMultipleDeletion(selectedClients); + } + }); + } + + private performMultipleDeletion(selectedClients: any[]): void { + this.loading = true; + const clientUuids = selectedClients.map((client: any) => client['@id']); + + this.dataService.deleteMultipleClients(clientUuids).subscribe({ + next: (response) => { + this.loading = false; + this.showDeletionResults(response, selectedClients); + + this.refreshData(this.selectedNode?.id); + this.selection.clear(); + }, + error: (error) => { + this.loading = false; + console.error('Error deleting multiple clients:', error); + this.toastr.error('Error al eliminar los clientes seleccionados'); + } + }); + } + + private showDeletionResults(response: any, selectedClients: any[]): void { + const dialogRef = this.dialog.open(DeleteResultsModalComponent, { + width: '600px', + data: { + response: response, + selectedClients: selectedClients, + totalSelected: selectedClients.length + } + }); + + dialogRef.afterClosed().subscribe(() => { + }); + } } diff --git a/ogWebconsole/src/app/components/groups/services/data.service.ts b/ogWebconsole/src/app/components/groups/services/data.service.ts index 8fb6aa7..ff2698b 100644 --- a/ogWebconsole/src/app/components/groups/services/data.service.ts +++ b/ogWebconsole/src/app/components/groups/services/data.service.ts @@ -246,4 +246,18 @@ export class DataService { return path.join(' / '); } + + deleteMultipleClients(clientUuids: string[]): Observable { + const url = `${this.baseUrl}/clients/delete-multiple`; + const body = { + clients: clientUuids + }; + + return this.http.post(url, body).pipe( + catchError(error => { + console.error('Error deleting multiple clients', error); + return throwError(error); + }) + ); + } } diff --git a/ogWebconsole/src/app/components/groups/shared/client-logs-modal/client-logs-modal.component.html b/ogWebconsole/src/app/components/groups/shared/client-logs-modal/client-logs-modal.component.html index c2d12a7..82b38d2 100644 --- a/ogWebconsole/src/app/components/groups/shared/client-logs-modal/client-logs-modal.component.html +++ b/ogWebconsole/src/app/components/groups/shared/client-logs-modal/client-logs-modal.component.html @@ -20,7 +20,7 @@